Answers:
您应该能够得到一个长度为String的字符串
Integer.MAX_VALUE
总是2147483647(2 31 - 1)
(由Java规范定义,阵列的最大尺寸,这对于内部存储String类用途)
OR
Half your maximum heap size
(因为每个字符都是两个字节),请以较小者为准。
我相信它们最多可以包含2 ^ 31-1个字符,因为它们由内部数组保存,并且数组在Java中由整数索引。
getBytes
如果尝试使用非常大的字符串,类似的字符串可能会出现问题。
从理论上讲,您可以使用Integer.MAX_VALUE个字符,但JVM可以使用的数组大小受到限制。
public static void main(String... args) {
for (int i = 0; i < 4; 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);
}
}
}
在Oracle Java 8 Update 92上打印
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
注意:在Java 9中,字符串将使用byte [],这意味着多字节字符将使用多个字节,并进一步减少最大值。如果您拥有所有四个字节的代码点(例如表情符号),则只会得到大约5亿个字符
您是否考虑过使用BigDecimal
而不是String
保留电话号码?
Java9使用byte []存储String.value,因此在Java9中您只能获得大约1GB的字符串。另一方面,Java8可以具有2GB的字符串。
字符我是指“字符”,某些字符在BMP中无法表示(例如某些表情符号),因此将需要更多(当前为2个)字符。