これら2つのステートメントの違いは何ですか?
String str = "stackoverflow";
&
String str = new String("stackoverflow");
文字列がプールから取得される方法が異なります。
1.あなたが言うとき、
String str = "stackoverflow"
最初"stackoverflow"
に、文字列プールにすでに存在するかどうかを確認します。含まれている場合は、プールから同じものを使用します。
これが、いつ、
String str1= "stackoverflow";
String str2 ="stackoverflow";
str1==str2? --> will be true
プールからの同じStringオブジェクトが使用されるため、上記の結果はtrueになります。
2.そうするとき、
String str = new String("stackoverflow");
同じオブジェクトがプールにすでに存在するかどうかに関係なく、常に新しいStringオブジェクトが作成されます。
それで、
String str1= "stackoverflow";
String str2 =new String("stackoverflow");
String str3 =new String("stackoverflow");
ここで、str2とstr3は再び新しいStringオブジェクトを作成します。
したがって、str2、str3、およびstr1はすべて、異なるオブジェクトを参照し、str2!=str3!=str1
コンストラクターのJavadocは次のようにpublic String(String arg)
述べています。
新しく作成されたStringオブジェクトを初期化して、引数と同じ文字シーケンスを表すようにします。つまり、新しく作成された文字列は引数文字列のコピーです。オリジナルの明示的なコピーが必要でない限り、文字列は不変であるため、このコンストラクターを使用する必要はありません。
String str = "stackoverflow"
コンパイラは、リテラルからStringオブジェクトを作成します。
これを行う
new String("stackoverflow");
と、2つが作成されます。1つはコンパイラーによって、もう1つはユーザーによって作成されます。
Javaには文字列用のプールがあります。詳細:http ://www.xyzws.com/Javafaq/what-is-string-literal-pool/3
最初の行は、stackoverflow文字列にメモリを割り当てます。次に、変数をこの場所にポイントします。
2行目は、文字列にスペースを割り当てます。次に、新しいStringクラスを作成します。文字列を最初の場所からメモリ内の新しい場所にコピーします。最後に、変数がその場所を指します。
2番目の例で行うのは、コンピューターの作業を増やし、メモリを消費することだけです。