222
    String s = "hello";
    String backup_of_s = s;
    s = "bye";

この時点で、バックアップ変数にはまだ元の値「hello」が含まれています (これは String の不変性によるものですよね?)。

しかし、このメソッドで文字列をコピーするのは本当に安全ですか(もちろん、通常の変更可能なオブジェクトをコピーするのは安全ではありません)、それともこれを書くほうがよいのでしょうか? :

    String s = "hello";
    String backup_of_s = new String(s);
    s = "bye";

つまり、これら 2 つのスニペットの違い (もしあれば) は何ですか?


編集 - 最初のスニペットが安全である理由:

すでに提供されている適切な回答に基づいて、もう少し詳しく説明しましょう (基本的には、2 つのスニペット間のパフォーマンスの違いの問題に焦点を当てていました)。

Java では文字列は不変です。つまり、構築後に String オブジェクトを変更することはできません。したがって、

String s = "hello";新しい String インスタンスを作成し、そのアドレスをs(sインスタンス/オブジェクトへの参照である) に割り当てます。

String backup_of_s = s;新しい変数backup_of_sを作成し、現在 によって参照されているオブジェクトを参照するように初期化しますs

注: 文字列の不変性により、このオブジェクトが変更されないことが保証されます: バックアップは安全です

backup_of_s注 2: Java ガベージ コレクション メカニズムは、少なくとも 1 つの変数 (この場合)によって参照されている限り、このオブジェクトが破棄されないことを保証します。

最後に、s = "bye";別の String インスタンスを作成し (不変性のため、これが唯一の方法です)、s変数を変更して、新しいオブジェクトを参照するようにします。

4

5 に答える 5

156

文字列は不変であるため、どちらのバージョンも安全です。ただし、後者はあまり効率的ではありません (余分なオブジェクトが作成され、場合によっては文字データがコピーされます)。

これを念頭に置いて、最初のバージョンを優先する必要があります。

于 2012-05-15T20:04:52.053 に答える
27

文字列は不変オブジェクトであるため、参照先のオブジェクトは変更できないため、それらへの参照をコピーするだけでコピーできます...

したがって、最初の例のように問題なくコピーできます。

String s = "hello";
String backup_of_s = s;
s = "bye";
于 2012-05-15T20:07:14.660 に答える
10

2 番目のバージョンは、必要がないときに余分な文字列オブジェクトを作成するため、効率が低下します。

不変性とは、最初のバージョンが期待どおりに動作することを意味するため、このアプローチが優先されます。

于 2012-05-15T20:05:45.640 に答える