TL;DR : 本当にやらなければならないことがあれば、やらなければならないnew String("abc")ことがわかり、その理由もわかるでしょう。非常にまれなので、必要がないと言っても過言ではありません。を使用するだけ"abc"です。
長いバージョン:
コードがある場合new String("abc")、次のことがさまざまな時点で発生します。
- そのコードを含むクラスが読み込まれるときに、文字を含む文字列
"abc"がまだインターン プールにない場合は、作成されてそこに配置されます。
new String("abc")コードが実行されると
:
- インターン プールからの文字列への参照がコンストラクタ
"abc"に渡されます。String
- 渡された からコンストラクターに文字をコピーすることにより、新しい
Stringオブジェクトが作成され、初期化されます。String
- 新しい
Stringオブジェクトが返されます。
new を使用して作成された文字列 "abc" もプールに文字列を配置したintern()場合、文字列プールに文字列が含まれている場合はプールから文字列が返され、そうでない場合は文字列オブジェクトがプールに追加されます。
それがinternそうするからです。文字列リテラルの呼び出しinternはノーオペレーションであることに注意してください。文字列リテラルはすべて自動的にインターンされます。例えば:
String s1 = "abc"; // Get a reference to the string defined by the literal
String s2 = s1.intern(); // No-op
System.out.println(s1 == s2); // "true"
System.out.println(s1 == "abc"); // "true", all literals are interned automatically
また、new を使用して String を作成した場合、実際に作成されるオブジェクトの数を知りたいですか?
少なくとも 1 つのStringオブジェクト (インターンされていない新しいオブジェクト) を作成し、場合によっては 2 つ (リテラルがまだプールにない場合) を作成します。
String s1 = "abc"; // Get a reference to the string defined by the literal
String s2 = new String(s1); // Create a new `String` object (guaranteed)
System.out.println(s1 == s2); // "false"
String s3 = s2.intern(); // Get the interned version of the string with these characters
System.out.println(s1 == s3); // "true"