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

评论

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

问题(来自SPOJ)可能包含100G的文件,您想一次将其加载到字符串中吗?严重...请使用扫描仪!

Java中String的最大长度的可能重复-调用length()方法

#1 楼

您应该能够得到长度为


Integer.MAX_VALUE的字符串,始终为2,147,483,647(231-1)
(由Java规范定义,即数组的最大大小,字符串类用于内部存储)

Half your maximum heap size(因为每个字符为两个字节),以较小者为准。


评论


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

–ChssPly76
09年7月24日在20:29

@ ChssPly76:是的,这是正确的。我编辑了答案,谢谢。

–比尔蜥蜴
09年7月24日在20:31

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

–cd1
09年7月24日在20:45

假设使用64位JVM,因为您需要8GB的虚拟内存来存储该长度的字符串。

–罗伯特·弗雷泽(Robert Fraser)
09年7月24日在20:59

Java 9将对每个仅具有iso-latin-1内容的字符串使用每个字符一个字节,因此此类字符串可以具有与堆中的字节数相同的字符(或最大数组长度,以较小者为准),而在另一方面另一方面,由于非拉丁字符串在数组中使用两个字节,因此在Java 9中,它们的最大字符串长度将减半,仅支持1073741823个字符。

–霍尔格
17年7月14日在15:35



#2 楼

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

评论


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

– Tom Hawtin-大头钉
09年7月24日在20:45

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

– aperkins
09年7月24日在20:49

#3 楼

从理论上讲,您可以使用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);
        }
    }
}


注意:在Java 9中,字符串将使用byte [],这意味着多字节字符将使用多个字节,并进一步减少最大字节数。如果您具有所有四个字节的代码点,例如表情符号,您只会得到大约5亿个字符

评论


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

– Apangin
16 Dec 8'在7:49

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

– Peter Lawrey
16 Dec 8'在8:05

#4 楼

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

评论


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

– Stephen C
09年7月25日在0:54

问题是“对于每个K,输出比K大的最小回文。” (其中K是给定的数字)。输出第一个小于K的回文将很简单。您需要算术来找到一个大于K的回文。示例:找到大于9​​99999999999的下一个回文,或大于12922的下一个回文。

–索比昂·拉文·安德森(ThorbjørnRavn Andersen)
09年7月25日在6:48

#5 楼

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

#6 楼

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

评论


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

– Aditya Gupta
18年5月24日在6:07

#7 楼

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

评论


除了Java的char类型精确为16位之外,因此UTF-16使用的位数并不重要。

–awksp
2014年7月9日在19:23

@awksp:char是16位,但是字符串中的一个字符可以占用两个char(两个“代理”代码元素来表示UTF16中的一个字符)。但是,Q仅用于十进制数字,不仅是BMP,而且是8859-1 / block0和ASCII。

–dave_thompson_085
10月9日15:33