c 获取char*的长度_最大的 String 字符长度是多少?
点击上方“武培轩”,选择“设为星标”
技术文章第一时间送达!
String 类可以说是在 Java 中使用最频繁的类了,就算是刚刚接触 Java 的初学者也不会陌生,因为对于 Java 程序来说,main 方法就是使用一个 String 类型数组来作为参数的(String[] args)。对于这样一个频繁使用的类,String 字符串可以有多长呢?十万字符?一百万字符?还是无限的呢?
要弄清楚 String 的最大长度,首先应该了解 String 类的内部实现。在 String 类中,是使用一个字符数组来维护字符序列的,其声明如下:
private final char value[];
这也就是说,String 的最大长度取决于字符数组的最大长度,我们知道,在指定数组长度的时候,可以使用 byte、short、char、int 类型,而不能够使用 long 类型。这也就是说,数组的最大长度就是 int 类型的最大值,即 0x7fffffff,十进制就是 2147483647,同理,这也就是 String 所能容纳的最大字符数量。
而且,我们来看下 java.lang.String#length() 源码:
public int length() { return value.length;}
可以看出获得 String 对象长度的 length 方法返回值是 int 类型的,而不是 long 类型的,也是因为这个原因。
不过,这个最大值只是在理论上能够达到的值,在我们实际的使用中,一般情况下获得的最大长度比理论值要小。下面我们写一个最简单的程序来看。
/** * @author wupx * @date 2020/01/13 */public class StringTest { public static void main(String[] args) { char[] c = new char[Integer.MAX_VALUE]; }}
运行这个程序,在通常情况下,都会产生如下的错误:
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit at test.StringTest.main(StringTest.java:9)
产生这个错误的原因就是内存溢出,也就是系统无法分配这么大的内存空间所致。计算一下,一个 char 类型占用 2 字节,2147483647 个 char 类型就是 4294967294 字节,这接近于 4GB 大小,想要申请这么一大块连续的内存空间,失败也就不足为奇了。
那么,到底我们所用的计算机能够承受多大的字符数组呢,这跟软件与硬件等诸多因素都有关,我们可以编写程序来获得可申请最大字符数组的近似值。
/** * @author wupx * @date 2020/01/13 */public class StringTest { public static void main(String[] args) { for (int i = 0; i < 100; i++) { int len = Integer.MAX_VALUE - i; try { char[] ch = new char[len]; System.out.println("len: " + len + " OK"); } catch (Error e) { System.out.println("len: " + len + " " + e); } } }}
运行结果如下:
len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limitlen: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limitlen: 2147483645 OKlen: 2147483644 OKlen: 2147483643 OK
根据运行结果可以看出 String 的最大长度为 Integer.MAX_VALUE - 2 或 2 ^ 31 - 3。
总结
在 String 类内部,是使用一个字符数组(char[])来维护字符序列的。
String 的最大长度也就是字符数组的最大长度,理论上最大长度为 int 类型的最大值,即 2147483647。
在实际中,一般可获取的最大值小于理论最大值,在我的电脑上得出的最大值是 2 ^ 31 - 3,大家可以在自己的电脑上测试下。
完
●你真的了解 volatile 关键字吗?●Java中Set集合是如何实现添加元素保证不重复的?●为什么不建议使用Date,而是使用Java8新的时间和日期API?
c 获取char*的长度_最大的 String 字符长度是多少?相关推荐
- java sessionid长度_设置TOMCAT SESSIONID 字符长度和生成算法
修改TOMCAT 默认的生成SESSION ID的算法和字符长度非常简单,只需修改context.xml中的标签值,比如: sessionIdLength="20" pathnam ...
- 最大的 String 字符长度是多少?
String 类可以说是在 Java 中使用最频繁的类了,就算是刚刚接触 Java 的初学者也不会陌生,因为对于 Java 程序来说,main 方法就是使用一个 String 类型数组来作为参数的(S ...
- 设计登录页面测试用例,页面包括账号、密码和验证码,账号字符长度小于20,密码字符长度小于30,验证码数字和字母组合,长度为4
1. 正确输入账号.密码和验证码,登录成功. 2. 账号为空,应提示"请输入账号". 3. 账号长度为19个字符,符合要求. 4. 账号长度为20个字符,符合要求. 5. 账号长度 ...
- mysql signed 长度_浅谈mysql字段长度设置
mysql 中最常用的数据类型是tinyint,smallint,int,bigint,char,varchar; char(n)和varchar(n)存储固定长度的字符数据,长度最大为254字节.使 ...
- mysql中char存储中文_数据库中的字符类型存储字符和汉字的数量
sqlServer2012(936 简体中文GBK )为例: 例如: varchar(10),只能存储10个英文字符或数字,也只能存储5个汉字: char(10),只能存储10个英文字符或数字,也只能 ...
- mysql float字节长度_分析MySQL数据类型的长度
分析MySQL数据类型的长度 MySQL有几种数据类型可以限制类型的"长度",有CHAR(Length).VARCHAR(Length).TINYINT(Length). SMAL ...
- mysql user 用户名长度_为什么注册的用户账号长度不能超过5个字符
注册程序如下,IIS6.02K3数据库是MYSQLODBC是最新版当新用户注册时,LOGINID长度不让超过5个字符,实际上数据库中这个字段是20个字符长库LOGINID=trim(request(& ...
- python汉字长度_行中字符串的长度(Python)
我正在尝试将一个.txt文件导入到一些专有软件中,但似乎不断收到一个错误.txt文件的大小几乎是2GB,大约有5600万行. 与制造商交谈后,他们说其中一条线路可能有错误.每一行应该包含一个MD5哈希 ...
- java获取长度_获取java长度
Java获取本机MAC地址 为什么写这个呢?因为前几天看见网上有采用windows命令获取局域网和广域网MAC,查了查可以直接用JDK的方法. MAC可用于局域网验证,提高安全性. import ja ...
最新文章
- oracle 不查加锁的记录,oracle 锁查询 select加锁方法
- python清空字典保留变量_python彻底清除字典数据,clear方法使用
- unittest单元测试框架总结
- boost::gil模块数字扩展中的 resample_pixels() 示例
- python中enumerate()的理解
- 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛
- tcp协议的主要功能是什么_计算机网络 | 一文搞懂什么是TCP/IP协议
- 用MySQL写怎么删除字母_mysql如何替换掉字母
- 贾跃亭的造车梦还在继续 旗下FF在国内成立新公司
- 带属性的向前声明:warning: type attributes are honored only at type definition
- hdu5187 奇怪题
- 《BI那点儿事》ETL中的关键技术
- PHP中的数组(数据结构)
- 这些JAVA毕业设计拿走不谢
- 记一次失败的机械键盘拆机换轴经历(含失败的经验总结)
- noip2018翻车记
- 视频压缩软件APP有哪些?让我来告诉你答案
- Git 学习(篇六 --储藏与清理)
- 创业公司 JPEGmini 可以将照片缩小5倍,但保证图片质量和分辨率
- 人工智能——机器学习与深度学习思维导图