0

このコードを考えると:

String first = "Hello world";

String second = first;

first = "Something else";

実行後、変数は、最初の代入でsecond変数が指していたのと同じメモリ インスタンスfirst(同じ "Hello world") を指しますか、それとも完全に異なるメモリ領域 ("Hello world" とも言う別のメモリ領域) を指しますか? ?

2 行目 (String other = originalString) のように複数の割り当てを行うとパフォーマンスが低下するかどうか、または他のオブジェクトを割り当てるのと同じくらい高速かどうかを知りたいです。

4

3 に答える 3

10

実行後、2 番目の変数は、最初の代入で変数が最初に指したのと同じメモリ インスタンス (同じ "Hello world") を指しますか、それとも完全に異なるメモリ領域 ("Hello world" とも言う別のメモリ領域) を指しますか? ")?

同じメモリ領域。

各段階で次のようなものがあります。

String first = "Hello world";

あなたにあげる:

+------+ +---------------+
| | 最初 |------------>| "こんにちは世界" |
+------+ +---------------+

それで

String second = first;
+--------+
| | 秒 |----\
+--------+ | +--------------+
               +---->| "こんにちは世界" | (上と同じ記憶)
+--------+ | +--------------+
| | 最初 |----/
+--------+

それで

first = "Something else";
+--------+ +---------------+
| | 秒 |------------>| "こんにちは世界" | (上と同じ記憶)
+--------+ +---------------+
+--------+ +------------------+
| | 最初 |------------>| "他の何か" |
+--------+ +------------------+
于 2013-08-04T12:54:36.523 に答える
2

2 番目は参照変数です。他の参照変数と同様に、それを別の変数に代入すると、オブジェクトではなく参照のみがコピーされます。2 つの参照変数は同じメモリを指しています。

2 行目 (String other = originalString) のように複数の割り当てを行うとパフォーマンスが低下するかどうか、または他のオブジェクトを割り当てるのと同じくらい高速かどうかを知りたいです。

オブジェクトを割り当てていません。オブジェクトへの参照を割り当てています。文字列への参照をコピーすることは、他の参照をコピーすることよりも高価ではありません。参照変数のコピーは非常に安価です。通常、パフォーマンスに大きな影響を与えることなく、読みやすさと理解を容易にするために、必要に応じて参照値をコピーできます。

于 2013-08-04T12:51:41.543 に答える
1

Java では、文字列リテラルは不変です。文字列リテラルが作成されると、変更することはできず、文字列定数プールに格納されます。これがあなたの場合にどのように機能するかです:

String first = "Hello world";

定数プールに新しい文字列が作成され、'first' がそれを指します。

String second = first;

first と second の両方の参照は、同じ文字列オブジェクトを指します。

first = "Something else";

この場合、文字列オブジェクト「Hello world」は変更されません。代わりに、新しいオブジェクト「Something else」が作成され、「first」がそれを指し始めます。「2番目の」参照はオブジェクト「Hello world」を指し続けます。

次に、次のような新しい参照を作成するとします。

String third = "Something else";

'=' 演算子を使用して first の参照値を割り当てていなくても、参照 'second' も最初と同じオブジェクトを指し始めます。

于 2013-08-04T13:06:44.887 に答える