2012-08-10 151 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