5

StringBufferのサイズに制限があるのはなぜですか?

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

それは int である count メンバー変数のためですか?

2^31-1 文字がStringBufferあり、それにさらに文字を追加するとしStringBufferます。カウント メンバー変数は、追加された文字数だけインクリメントされ、カウント変数が既に最大値 (2^31-1) になっている場合は、負の値に戻ります。

なぜエラーが発生するのでしょうか?

4

4 に答える 4

14

stringbuffer は内部的に配列を使用し、配列が収容できる要素の最大数は 2^31-1 であるため、これに達した後にインクリメントすると負になり、エラーがスローされます。

于 2012-08-10T20:19:30.123 に答える
4

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

于 2012-08-10T20:24:03.847 に答える
3

答えは、システム アーキテクチャによって異なります。

2012年に回答を投稿したときのこの古いマシン

文字の最大長 = 37748734

Java バージョン: 1.6.0_35

OS:Windows7

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

RAM:2GB

プロセッサ: Pentium デュアルコア E5800 3.20GHz

2016年

文字の最大長 = 301989886

Java バージョン: 1.8

OS : Ubuntu 14 LTE および Windows 7

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

RAM:8GB

プロセッサ: Intel(R) Core(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
于 2012-11-02T12:04:44.507 に答える
0

バッファ内の 2^31 文字近くになっている場合は、それが間違っていて、ずっと前にメモリが不足していたでしょう。

于 2012-08-10T20:19:35.993 に答える