Java String可以有多少个字符?
Java中的字符串可以理论上拥有Integer.MAX_VALUE个字符,但是JVM对于可以使用的数组大小有限制。
在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 8中,字符串的最大字符数为2147483645个字符。
值得注意的是,在Java 9中,字符串将使用byte[],这意味着多字节字符将使用多个字节并进一步减少最大字符数。如果字符串中包含所有四个字节的代码点(如表情符号),最多只能获得大约五亿个字符。
Java 9中的Compact Strings使用Latin-1或UTF-16编码,没有可变长度编码,即没有三个字节的字符。
感谢更正,"不使用其他编码,如UTF-8"。
解决方法暂无。
Java中的字符串长度有一定的限制,这个限制是由Java规范和Java虚拟机(JVM)决定的。下面是关于Java字符串长度的限制和解决方法的讨论:
根据Java规范,一个Java字符串的最大长度是Integer.MAX_VALUE,即2147483647。这是由Java规范定义的数组的最大大小,而字符串类在内部使用数组来存储数据。
另一种限制是由JVM的最大堆大小决定的。由于每个字符占用两个字节的空间,所以字符串的最大长度应该是最大堆大小的一半。如果最大堆大小比Integer.MAX_VALUE小,那么字符串的最大长度就是最大堆大小的一半。
要找出JVM的最大堆大小,可以通过一些方法来获取。但是,不知道评判系统使用的是哪个JVM来测试问题,因此不确定Integer.MAX_VALUE是否是JVM特定规范的一部分。
然而,Integer.MAX_VALUE是独立于JVM的,所以可以保证它的值是一样的。
实际上,需要将内存除以4到6,因为在构建字符串时需要使用StringBuilder或类似的方法,这意味着内存中必须存在两个副本。如果StringBuilder的容量正好合适,可以除以4,但如果容量较大,除以6会更安全。
Java 9中的字符串长度限制与之前的版本有所不同。对于只包含iso-latin-1字符的字符串,Java 9将每个字符使用一个字节来存储,因此这种字符串的最大长度取决于堆的大小(或者最大数组长度,以较小的值为准)。然而,对于包含非拉丁字符的字符串,每个字符仍然需要两个字节的空间,因此在Java 9中,这种字符串的最大长度将减半,只支持1073741823个字符。
某些情况下了字符对象所需的两个字节是否取决于编码方式。事实上,Java 8之前的版本中,字符串使用UTF16编码,BMP字符占用2个字节,补充字符占用4个字节。而在Java 9及以后的版本,如果所有字符都是8859-1(也称为Latin-1)字符块中的字符,那么字符串将使用1个字节来存储每个字符,否则还是使用UTF16编码。字符串不会使用UTF8编码,但可以在输入输出时使用UTF8。原始的char数据类型始终是2个字节,但现在可以将其转换为字符串元素。
Java中字符串的长度受到Java规范和JVM的限制。字符串的最大长度可以是Integer.MAX_VALUE或最大堆大小的一半,具体取决于哪个值较小。在Java 9中,字符串的最大长度可能因为编码方式的不同而有所不同。