1

String非常に頻繁に使用する値を保存するときにメモリ消費を削減できますか?

"some text"私の知る限り、コードで宣言を行うたびにString、同じ値を持つ既存のオブジェクトのアドレスを使用する代わりに、新しいオブジェクトが構築されます。これは正しいです?

String新しいものを作成するのではなく、常に同じアドレスを指定することで、メモリをより効率的にするためにできることはありますか?

4

4 に答える 4

2

.NET は、文字列インターン プールを使用して文字列を格納します。

共通言語ランタイムは、インターン プールと呼ばれるテーブルを維持することにより、文字列ストレージを節約します。このテーブルには、プログラムでプログラムによって宣言または作成された一意の各リテラル文字列への単一の参照が含まれています。したがって、特定の値を持つリテラル文字列のインスタンスは、システム内に 1 回だけ存在します。

以下の例は、intern プールがリテラル文字列のみに使用されることを示しています。(中身は同じでもs2同じ文字列を参照しない)s1

string s1 = "MyTest"; 
string s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
string s3 = String.Intern(s2); 
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.

Java は同じことを行います:

すべてのリテラル文字列と文字列値の定数式はインターンされます。

于 2010-10-13T14:44:45.763 に答える
1

java 2 SDKのapi-docから:

最初は空の文字列のプールは、Stringクラスによってプライベートに維持されます。インターンメソッドが呼び出されたときに、equals(Object)メソッドによって決定されたこのStringオブジェクトに等しい文字列がプールにすでに含まれている場合、プールからの文字列が返されます。それ以外の場合、このStringオブジェクトはプールに追加され、このStringオブジェクトへの参照が返されます。

だからプーリングがあります...

ここの記事はそれについていくつかの良い点を示しています。

于 2010-10-13T14:49:32.473 に答える
1

あなたが対処しようとしている真のパフォーマンス/メモリの問題を特定できない限り、私はそれを気にしません. 絶対に最適化する必要がある場合は、Java の内部文字列プールを使用するなど、メモリを節約する方法に関するヒントを示す便利な記事が Javamex にあります。

于 2010-10-13T14:47:30.210 に答える
0

Javaでは、あなたは完全に間違っています。実際、.net のように (または少なくとも @madgnome が言うように)、定数文字列プールがあります。すべての定数文字列に加えて、 を呼び出してこのプールに文字列をプッシュできることに注意してくださいString.intern()。ただし、このメソッドはプールの性質上遅くなる可能性があるため、注意して使用してください。

于 2010-10-13T14:48:50.697 に答える