最大的 String 字符长度是多少?
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
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 limit len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit len: 2147483645 OK len: 2147483644 OK len: 2147483643 OK
根据运行结果可以看出 String 的最大长度为 Integer.MAX_VALUE - 2 或 2 ^ 31 - 3。
总结
在 String 类内部,是使用一个字符数组(char[])来维护字符序列的。
String 的最大长度也就是字符数组的最大长度,理论上最大长度为 int 类型的最大值,即 2147483647。
在实际中,一般可获取的最大值小于理论最大值,在我的电脑上得出的最大值是 2 ^ 31 - 3,大家可以在自己的电脑上测试下。
- 网址(URL)支持的最大长度是多少?最大支持多少个字符?
- (字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可)
- (字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可)
- Java中String接受的最大字符串的长度是多少
- GET与POST传递数据的最大长度能够达到多少
- textarea限制最大字符长度和默认输入了空格回车的问题
- MySQL中varchar最大长度是多少?
- 两个String的比较(长度相同,含有相同的字符就相等)
- MySQL中varchar最大长度是多少?
- 【转】MySQL中varchar最大长度是多少?
- 关于String中各种编码中文字符的字节长度
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- get请求的最大字符长度
- TCP 、UDP、IP包的最大长度是多少?
- HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
- utf-8里现在已经用到的字符最大编码是多少
- 如果字符串的一个子串(其长度大于 1)的各个字符均相同,则称之为等值子串。试设计一算法,求出串S中的最大等值子串 函数返回最大等值子串的长度,如果没有则返回1。 例如: 若S= “abc123abc1
- 修复laravel5.4版本string字符长度报错问题
- MySQL中varchar最大长度是多少?
- string常量及字符数组的长度函数、赋值、拼接、附加