一个Java字符串可以有几个字符?


157

我正在尝试使用 Sphere Online Judge(SPOJ)的Next Palindrome问题,在问题中,我需要找到最多100万个整数的回文。我曾考虑过使用Java的函数来反转字符串,但是它们会允许字符串这么长吗?


您是在说您需要编写一个生成回文的函数,该回文的大小由用户指定,并且长度可以达到一百万个字符?
罗伯特

3
问题(从SPOJ)可能包含100Gigabyte文件,您想将其加载到一个字符串一次?严重...请使用扫描仪!
严峻2015年

Answers:


242

您应该能够得到一个长度为String的字符串

  1. Integer.MAX_VALUE总是2147483647(2 31 - 1)
    (由Java规范定义,阵列的最大尺寸,这对于内部存储String类用途)
    OR

  2. Half your maximum heap size(因为每个字符都是两个字节),请以较小者为准


43
...或您的最大堆大小除以2 ... ...因为字符是2个字节
ChssPly76

2
@ ChssPly76:是的,这是正确的。我编辑了答案,谢谢。
比尔蜥蜴

2
如何找出最大堆大小?另外,我不知道法官用来测试我的问题的Java虚拟机是否是JVM规格的一部分,取决于Integer.MAX_VALUE?
andandandand

6
Integer.MAX_VALUE 始终为 2147483647(2 ^ 31-1),这是Java规范的一部分。
CD1

4
假设使用64位JVM,因为您需要8GB的虚拟内存来存储该长度的字符串。
罗伯特·弗雷泽

21

我相信它们最多可以包含2 ^ 31-1个字符,因为它们由内部数组保存,并且数组在Java中由整数索引。


内部实现无关紧要-例如,没有理由不能将字符数据存储在long类型数组中。问题是接口使用整数作为长度。getBytes如果尝试使用非常大的字符串,类似的字符串可能会出现问题。
Tom Hawtin-大头钉

没错-我是在暗示这个事实。我的错。
aperkins

15

从理论上讲,您可以使用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亿个字符


2
Java 9中的紧凑字符串使用Latin-1或UTF-16编码。没有可变长度编码,即没有三个字节字符。
apangin '16

@apangin“使用诸如UTF-8之类的替代编码不是目标”,感谢您的纠正。
彼得·劳瑞

5

您是否考虑过使用BigDecimal而不是String保留电话号码?


1
这取决于应用程序将如何处理这些数字。如果只是做诸如查找回文,计算(十进制)数字之类的文本操作,那么String会更好。如果要进行算术运算,则最好使用BigDecimal(或BigInteger)。
Stephen C

问题是“对于每个K,输出比K大的最小回文。” (其中K是给定的数字)。输出第一个小于K的回文报将很简单。您需要算术以找到一个大于K的回文。例如:找到下一个大于999999999999的下一个回文报,或大于12922的下一个回文。
ThorbjørnRavn Andersen 2009年

4

Integer.MAX_VALUE是字符串的最大大小+取决于您的内存大小,但是球的在线问题认为您不必使用这些函数


3

Java9使用byte []存储String.value,因此在Java9中您只能获得大约1GB的字符串。另一方面,Java8可以具有2GB的字符串。

字符我是指“字符”,某些字符在BMP中无法表示(例如某些表情符号),因此将需要更多(当前为2个)字符。


4
您是否可以附加Java-9的参考,以将字符串大小从2 GB限制为1 GB
Aditya Gupta,

-1

我的朋友,堆的部分变得更糟。不保证将UTF-16限制为16位,并且可以扩展为32位


2
除了Java的char类型恰好是16位,所以UTF-16使用的位数并不重要……
awksp 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.