3

等しい文字列を多数格納しています。値は頻繁に変更されることはありません。

参照のみを返すことになっているのでstring.intern()、に格納されている1億個のまったく同じ文字列のリストのそれぞれをインターンしましたArrayList

Javaのメモリが大幅に減少することを期待していましたが、通常の文字列とインターンされた文字列の保存では、0.1%未満の違いが見られました。

私は何かが足りないのですか、それともこれは予想される動作ですか?

リスト生成コード

    long max = 100000000;
    for(int i =0 ; i < max;i++ ){
        list.add("sometextelidedforbrevity".intern());
    }

なしのメモリ使用量は1242360 KBで、ありの場合は1 242184KBです。

4

2 に答える 2

4

文字列リテラルは自動的にインターンされます。つまり、式"sometextelidedforbrevity"は実行時に常に、Stringインターンされたオブジェクト参照になります。intern()すでにインターンされている文字列を呼び出すことは、事実上何もしません。

于 2013-03-21T19:07:12.720 に答える
0

コメントで答えてくれたcdhowieとRusselZahniserのおかげで、私はドキュメントで見落としていた文字列リテラルを使用していました。

彼らはすでにリテラルを使用して抑留されていました。

私が理解していることから、文字列をインターンしない唯一の方法は、new String()によるものです。

于 2013-03-21T19:07:03.967 に答える