2012-01-12 10 views
3

オブジェクトがインスタンス化された後、アプリケーションでStringの作成を制限しようとしています。したがって、このtoStringが呼び出されるたびに新しいStringが作成されるかどうかは分かりません。それは悪い質問かもしれないが、私は答えを知らない。提案してください。この関数は、これが呼び出されるたびに新しいStringを作成しますか?

-

私は単なる文字列が作成されている場合、それは文字列プールに格納されていることを覚えて、その後、それは常に再作成されずにプールから取得されます。私は正しい?

+0

すべての文字列が "文字列プール"に格納されているわけではありませんが、プログラムのリテラルは(Skeet氏が記述しているように)です。そのため、関数によって新しいStringが作成されることはありません。 –

答えて

9

いいえ、毎回別の文字列を作成しません。文字列定数はです。 - 実際には定数 "NotSubscribed"は、このメソッドが実行されるたびに、コード全体で同じ文字列オブジェクトを参照します。

section 3.10.5 of the Java Language Specificationより:

各文字列リテラルは、クラス列(§4.3.3)のインスタンスへの参照(§4.3)(§4.3.1、§12.5)です。 Stringオブジェクトは定数値を持ちます。文字列リテラル、またはより一般的には、定数式(15.28)の値である文字列は、String.internメソッドを使用して一意のインスタンスを共有するように「中止」されています。

私は単なる文字列が作成されている場合、それは文字列プールに保管され、その後、それは常に再作成されずにプールから取得されていることを思い出した:しかし、あなたの編集に

。私は正しい?

いいえ、それは正しくありません。文字列のうち、定数はデフォルトで使用できません。たとえば、次のコードを実行するたびに:

public List<String> createStrings() { 
    List<String> list = new ArrayList<String>(); 
    for (int i = 0; i < 10; i++) { 
     list.add("foo" + i); 
    } 
    return list; 
} 

...これで別の10文字列が作成されます。

+0

が私の解釈である15.28項の解釈で、あなたの例( 'list.add(" foo ")')から '+ i'を削除すると、' String'が1つしか作成されません。 – Robin

+0

@Robin:はい、そうです。 –

関連する問題