一个Java字符串可以有多少个字符?
我正在尝试Sphere Online Judge(SPOJ)中的下回文版问题,我需要找到一个高达一百万位数的整数回文。 我想过使用Java的函数来反转字符串,但他们会允许一个字符串这么长吗?
您应该能够得到一个长度为Integer.MAX_VALUE的字符串(Java规范始终为2147483647(2 31-1),String类用于内部存储的最大数组大小),或者最大堆大小的一半因为每个字符都是两个字节),以较小者为准。
我相信它们最多可以是2 ^ 31-1个字符,因为它们是由内部数组保存的,而数组是通过Java中的整数索引的。
虽然理论上可以使用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更新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 [],这意味着多字节字符将使用多个字节并进一步降低最大值。 如果你有四个字节的代码点,比如emojis,那么你只能得到大约5亿个字符
你有没有考虑使用BigDecimal
而不是String
来保存你的数字?
Integer.MAX_VALUE是字符串的最大大小+取决于你的内存大小,但球面的在线判断问题你不必使用这些函数
我的朋友们,堆部分变得更糟。 UTF-16不保证限制在16位,可以扩展到32位
Java9使用byte []来存储String.value,所以在Java9中只能得到大约1GB的字符串。 Java8另一方面可以有2GB的字符串。
按照字符我的意思是“字符”,一些字符不能在BMP中表示(像一些表情符号),所以它会需要更多(目前2个)字符。
如果您使用谷歌的应用程序引擎,com.google.appengine.api.datastore.Text可以帮助。 它允许一个字符串存储高达1兆字节。