1

これら2つのステートメントの違いは何ですか?

String str = "stackoverflow";

String str = new String("stackoverflow");
4

4 に答える 4

4

文字列がプールから取得される方法が異なります。

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

于 2012-05-23T06:44:59.090 に答える
2

コンストラクターのJavadocは次のようにpublic String(String arg)述べています。

新しく作成されたStringオブジェクトを初期化して、引数と同じ文字シーケンスを表すようにします。つまり、新しく作成された文字列は引数文字列のコピーです。オリジナルの明示的なコピーが必要でない限り、文字列は不変であるため、このコンストラクターを使用する必要はありません。

String str = "stackoverflow" コンパイラは、リテラルからStringオブジェクトを作成します。

これを行う new String("stackoverflow"); と、2つが作成されます。1つはコンパイラーによって、もう1つはユーザーによって作成されます。

于 2012-05-23T06:40:07.563 に答える
2

Javaには文字列用のプールがあります。詳細:http ://www.xyzws.com/Javafaq/what-is-string-literal-pool/3

于 2012-05-23T06:40:09.847 に答える
2

最初の行は、stackoverflow文字列にメモリを割り当てます。次に、変数をこの場所にポイントします。

2行目は、文字列にスペースを割り当てます。次に、新しいStringクラスを作成します。文字列を最初の場所からメモリ内の新しい場所にコピーします。最後に、変数がその場所を指します。

2番目の例で行うのは、コンピューターの作業を増やし、メモリを消費することだけです。

于 2012-05-23T06:41:19.330 に答える