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"