Java String可以有多少个字符?

10 浏览
0 Comments

Java String可以有多少个字符?

我正在尝试来自Sphere Online Judge(SPOJ)的“下一个回文数”问题,我需要找到一个最多有一百万位数字的整数的回文数。我考虑使用Java的字符串反转函数,但它们是否允许字符串如此长?

0
0 Comments

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"。

解决方法暂无。

0
0 Comments

Java字符串的最大长度是多少?

根据Java中数组的索引方式,Java字符串可以具有最多2^31-1个字符。

内部实现方式并不重要-字符数据可以存储在long类型的数组中,例如。问题在于接口使用int类型的长度。如果尝试使用非常大的字符串,则getBytes等方法可能会出现问题。

这是真的-我在暗示这个事实。我的错误。

0
0 Comments

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中,字符串的最大长度可能因为编码方式的不同而有所不同。

0