6

わかりました、この質問はこの質問の延長です

Java Strings: "String s = new String("silly");"

上記の質問はこれと同じ質問をしましたが、私は新たな疑問点があります。

Effective Javaおよび上記の質問の回答によると、不要なオブジェクトが作成されるため、行うべきではありません。String s = new String("a new string");

Javaは自動文字列インターニングを行っていると思うので、この結論についてはよくわかりません。つまり、文字列の場合、メモリにはそのコピーが1つしかありません。

それでは見てみましょうString s = new String("a new string");

"a new string"は既にメモリ内に作成された文字列です。

私がするときString s = new String("a new string");、それs"a new string"です。によるとautomatic string interningsは の同じメモリ アドレスを指す必要があります"a new string"ね。

では、不要なオブジェクトを作成しているとどのように言えますか?

4

3 に答える 3

16

String a = "foo"; // this string will be interned
String b = "foo"; // interned to the same string as a
boolean c = a == b; //this will be true
String d = new String(a); // this creates a new non-interned String
boolean e = a == d; // this will be false
String f = "f";
String g = "oo";
String h = f + g; //this creates a new non-interned string
boolean i = h == a // this will be false
File fi = ...;
BufferedReader br = ...;
String j = br.readLine();
boolean k = a == j; // this will always be false. Data that you've read it is not automatically interned
于 2012-05-19T15:38:34.187 に答える
2

JVMの文字列リテラル プールについて詳しくお読みください。クイックグーグルでこの記事を見つけました: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 これはかなり有効なようです。

また、整数リテラルのプーリングや、Java での他のリテラルのプーリングにも興味があるかもしれません。

于 2012-05-19T15:44:04.463 に答える
0

複数のインスタンスではなく単一のインスタンスになる可能性があるため、「=new String」の代わりに「=」を使用することをお勧めします。

于 2012-05-19T15:42:14.067 に答える