2009-07-24 73 views
119

我正在尝试来自Sphere Online Judge(SPOJ)的The Next Palindrome问题,在那里我需要找到一个高达一百万位数的整数的回文。我想过使用Java的函数来反转字符串,但是它们会允许字符串变长吗?Java String有多少个字符?

+0

你是说你需要编写一个生成回文的函数,它的大小是用户指定的,可以长达100万个字符? – Robert 2009-07-24 20:29:47

+3

*问题*(来自SPOJ)可能包含一个100G字节的文件,并且您希望一次将其加载到一个字符串中?认真...请使用扫描仪!的 – 2015-02-17 14:11:05

+0

可能的复制[字符串的在Java中的最大长度 - 调用length()方法(https://stackoverflow.com/questions/816142/strings-maximum-length-in-java-calling-length-method) – Bergi 2017-06-16 05:55:18

回答

175

你应该能够得到长Integer.MAX_VALUE的字符串(总是2147483647(2 - 由Java规范1),数组,字符串类使用内部存储的最大尺寸),或者你一半最大堆大小(因为每个字符都是两个字节),以较小者为准。

+31

...或您的最大堆大小除以2 ...因为字符是2个字节 – ChssPly76 2009-07-24 20:29:37

+2

@ ChssPly76:是的,这是正确的。我编辑了我的答案,谢谢。 – 2009-07-24 20:31:51

+2

如何找出最大堆大小?另外,我不知道使用哪个java虚拟机来判断我的问题是Integer.MAX_VALUE是否依赖于JVM规范的一部分? – andandandand 2009-07-24 20:40:43

16

我相信他们可以达到2^31-1的字符,因为它们是由一个内部数组保持,并且阵列由在Java中的整数索引。

+0

内部实现是无关紧要的 - 例如,没有理由为什么字符数据不能存储在一个long数组中。问题是接口使用整数长度。如果你尝试一个非常大的字符串,'getBytes'和类似可能会有问题。 – 2009-07-24 20:45:59

+0

这是真的 - 我暗示了这个事实。我的错。 – aperkins 2009-07-24 20:49:53

3

Integer.MAX_VALUE的是字符串的最大尺寸+取决于你的内存大小,但对球的判断网上的问题,你不必使用这些功能

5

你有没有使用BigDecimal代替String握住你的号码被认为?

+1

这取决于应用程序将如何处理数字。如果它只是做文本的事情,如发现回文,计数(十进制)数字,那么字符串更好。如果要进行算术运算,BigDecimal(或BigInteger)更好。 – 2009-07-25 00:54:35

+0

问题是“对于每个K,输出大于K的最小回文。” (其中K是给定的数字)。输出第一个小于K的回文会非常简单。您需要用算术找到比K更大的回文。示例:查找大于999999999999的下一个回文,或大于12922的下一个回文。 – 2009-07-25 06:48:18

0

我的朋友们,堆部分变得更糟。 UTF-16不能保证被限制到16位,可以扩展到32

+1

除Java的'char'类型为16位,所以UTF-16使用的位数并不重要...... – awksp 2014-07-09 19:23:45

-3

如果你使用谷歌的App Engine,com.google.appengine.api.datastore.Text可以提供帮助。它允许一个字符串存储高达1兆字节。

+9

字符串已经可以存储高达2GB,所以一个可以存储高达1MB的类在这里没有帮助。 – 2015-07-28 16:17:57

+1

如果你包含一个链接到一个网页,这将更详细地解释这个链接,并且在你的回答 – 2015-12-10 17:52:26

10

虽然你可以在理论上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,字符串将使用字节[],这将意味着,多字节的字符将使用一个以上的字节并减少最大进一步。如果你有全部四个字节的代码点,例如表情符号,你将只能得到大约500万字

+1

[Compact Strings](http://openjdk.java.net/jeps/254)在Java 9中扩展使用Latin-1或UTF-16编码。没有可变长度编码,即没有三字节字符。 – apangin 2016-12-08 07:49:03

+0

@apangin“使用UTF-8等替代编码不是目标”谢谢你的纠正。 – 2016-12-08 08:05:22

1

Java9使用字节[]存储String.value,所以你只能得到大约1GB的字符串中Java9。另一方面,Java8可以有2GB的字符串。

通过角色,我的意思是“字符” S,一些字符不是在BMP所能表述的(像一些表情符号),因此将需要更多的(目前2)字符。