2012-08-10 166 views
5

为什么StringBuffer的尺寸有限制?StringBuffer的最大尺寸

我经历了一些链接: http://www.coderanch.com/t/540346/java/java/maximum-size-hold-String-buffer

是因为计数成员变量,这是一个int?

假设我们在StringBuffer中有2^31-1个字符,并且我们在StringBuffer附加了一些字符。 Count成员变量会增加chars的数量,如果Count变量已经处于最大值(2^31-1),它将回到某个负值。

为什么会抛出错误?

+0

不要使用一个StringBuffer时,你可以使用StringBuilder(它具有相同的限制虽然) – 2012-08-10 20:58:03

+1

A 2^32-1 StringBuilder将需要4 GB。你想创建这么长的字符串吗? – 2012-08-10 20:58:47

回答

13

因为StringBuffer的内部使用数组,数组可以容纳元素的最大数量为2^31-1,如果你达到这个后增加它会去否定,并引发错误

+0

为什么数组中的元素数量有最大限制,是否在java规格中提到? – vjk 2012-08-10 20:24:30

+0

@vjk随机数组访问使用一个整数的位置。即:myArray [8]。你将如何访问MAX_INT + 1位置的元素? – 2012-08-10 20:26:19

+0

只是尝试创建一个数组的大小一些long值 – 2012-08-10 20:26:57

0

如果你成气候在你的缓冲区中接近2^31个字符时,你做错了,而且你很久以前就会耗尽内存。

+4

我同意你的观点,他做错了。但是没有理由认为他会失去记忆。 – 2012-08-10 20:22:46

4

StringBuffer使用char[]
在Java中,只能通过整数对数组进行索引,这意味着该数组的索引的最高值可以是Integer.MAX_VALUE-1(即2^31-1)。这意味着Java中的数组大小不能大于Integer.MAX_VALUE

3

答案因系统体系结构而异。

这个古老的机器时,我张贴的答案2012字符的

最大长度=

Java版本:1.6.0_35

操作系统:Windows 7

系统结构:32位(x86)

RAM:2 GB

处理器:Pentium双核E5800 3.20GHz

在2016

字符的最大长度=

Java版本: 1.8

OS:Ubuntu的14 LTE和Windows 7

系统架构:64位(x86_64的)

RAM:8 GB

处理器:Intel(R)核心(TM)i3-4130 CPU @ 3。40GHz的

运行这个程序,你的自我

 StringBuffer strbTest = new StringBuffer(); 
     long len = 0; 
     try { 
      System.out.println("Wait.... til number not generated."); 

      while(true) { 
       strbTest.append("a"); 
       len++; 
      } 
     } catch (OutOfMemoryError e) { 
      System.out.println("Max length on your system is "+len); 
      System.out.println("Error"); 
     } 
     System.out.println("End"); 

输出

Max length on your system is 37748734 
+0

是的,我跑了,得到了完全相同的价值 - > 37748734.我的系统也是一个C2D e7500和4演出的内存。我正在运行32位窗口。整数最大值是2147483647. – avinashkr 2016-08-02 12:08:34

+0

我跑了,得到了不同的回答,我发布了:301989886,x86_64机器8 GB Ram,Java 1.8和4 GHz处理器。在其他x86_64系统上有相同的号码。 – 2016-08-02 12:39:55

+0

重要的是您的JVM版本和平台中的StringBuffer类的impl ...当需要扩展其容量时,它可以使用加载因子,并且可以使用Integer.MAX_VALUE(2^31 - 1,因为每个人都指向出)在爆炸之前的最大容量...所以如果你没有得到这个值,这是因为你的实现只是扩展数组,直到它检测到溢出......这个尝试之前尝试Integer.MAX_VALUE:http:// grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/AbstractStringBuilder.java#AbstractStringBuilder.expandCapacity%28int%29 – Renato 2017-04-05 18:16:20