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
変数を変更して、新しいオブジェクトを参照するようにします。