2012-08-10 37 views
5

なぜStringBufferのサイズに制限がありますか?StringBufferの最大サイズ

私はいくつかのリンク: http://www.coderanch.com/t/540346/java/java/maximum-size-hold-String-bufferを調べました。

これは、countメンバー変数のためですか?これはintですか。

StringBufferに2^31-1の文字があり、さらにStringBufferにいくつかの文字が追加されているとします。 Countメンバ変数は、追加された文字数だけインクリメントされ、Count変数がすでに最大値(2^31-1)にある場合、負の値に戻ります。

なぜエラーが発生しますか?

+0

あなたが(それはしかし、同じ制限があります) –

+1

2のStringBuilderを使用することができるときにStringBufferを使用しないでください^ 32-1 StringBuilderは4 GBを使用します。あなたはそのような長い文字列を作成するのが好きですか? –

答えて

13

のStringBufferは、内部配列を使用して、配列を収容することができます要素の最大数は2^31-1あなたはこれを到達した後インクリメントされている場合、それは負に行くだろうし、あなたがどこにも取得している場合は、エラー

+0

なぜ配列の要素の数に最大限の制限があるのですか?それはjava仕様のintですか? – vjk

+0

@vjkランダム配列アクセスは、その位置に整数を使用します。すなわち:myArray [8]。 MAX_INT + 1の位置にある要素にはどのようにアクセスしますか? –

+0

ちょっとした値の配列を作成しようとしました –

0

をスローしますのであなたのバッファーの2^31文字近くでは間違っているので、ずっと前にメモリが足りなくなってしまいます。

+4

私はあなたが間違っている点についてあなたに同意します。しかし、彼が記憶不足になると思う理由はありません。 –

4

StringBufferは、char[]を使用します。
Javaでは、配列はの整数を介してのみに索引付けすることができます。これは、配列のインデックスが最大値であることを意味します。Integer.MAX_VALUE-1(つまり2^31-1)です。つまり、Javaでの配列のサイズは、Integer.MAX_VALUE

3

より大きくすることはできません。

私は2012

文字の最大長=

Javaバージョンで答えを掲載、この古いマシン:1.6.0_35

OS:Windows 7の

は、

システムアーキテクチャ:32ビット(x86)

RAM:2ギガバイト

プロセッサ:2016

文字の最大長=

JavaのバージョンでのPentiumデュアルコアE5800 3.20GHz

1.8

OS:Ubuntuの14 LTEおよびWindows 7

システムアーキテクチャ:64-ビット(x86_64版)

RAM:8ギガバイト

プロセッサ:3 @インテル(R)Core(TM)i3-4130 CPU。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ビットのウィンドウを実行しています。 Integer MAX VALUEは2147483647です。 – avinashkr

+0

301989886、x86_64マシンの8 GB RAM、Java 1.8および4 GHzプロセッサと、別の答えが出てきました。同じ番号が他のx86_64システムにあります。 –

+0

JVMのバージョンとプラットフォームのStringBufferクラスのインプリメンテーションは、容量を拡張する必要がある場合は負荷係数を使用し、Integer.MAX_VALUE(2^31 - 1は誰もが指しているので使用します) out)を吹き飛ばす前の最大容量...だから、その値が得られないのは、実装がオーバーフローを検出するまで配列を拡張しているだけなので...これは、吹き飛ばす前に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