-3

2つのステートメントの違いは正確には何ですか

String s1="abc";
String s2=new String("abc");

私が知っていることから、最初のステートメントは文字列プールにオブジェクトを作成し、s1 はそれをリーファーするということです。2 番目のステートメントでは、 new キーワードを使用し、s2 が String プール内のオブジェクトを参照するため、2 つのオブジェクトが作成されます。

ここで、両方のステートメントを次々に実行すると、最初のステートメントはオブジェクト「abc」が文字列プールにあり、2 番目のステートメントの実行で s2 は、文字列プールに既に存在するオブジェクトを参照します。 =s2 true を返す必要がありますが、false を返します。

理由を教えてください。

4

2 に答える 2

5

実際にはString s1="abc"、不変の文字列が保持される特別な場所である文字列プール内に文字列が割り当てられます。直接変更することはできませんが、それを指す"abc"参照 ( ) だけです。s1

2 番目のケースでは、文字列データが格納されるバッファString s2=new String("abc")を内部的に持つ実際の文字列オブジェクトを割り当てています。char[]最初のものと同様に不変ですが、ヒープ上のオブジェクトです。

を比較するとs1 == s2、参照を比較しているため、1 つが文字列プール内の文字列を指しているため (ラッパー オブジェクトが作成されているのか、プール内のオブジェクトへの直接参照が使用されているのかは実際にはわかりません)、それらは異なります。 2 つ目は、明示的に作成したオブジェクトを指します (char[]データが格納されているバッファーをラップします)。

于 2013-02-19T18:13:59.630 に答える
1

2 つの異なるオブジェクトを作成しています。s1 には、参照アドレスを保持するための独自のメモリがあります。s2も同様。これらのオブジェクトはどちらも文字列プール内の同じ文字列を指していますが、オブジェクト自体は異なります。したがって、s1==s2 は失敗します。

ただし、文字列の内容を比較しているため、s1.equals(s2) は機能します。

于 2013-02-19T18:12:48.190 に答える