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 s = "hello";
新しいStringインスタンスを作成し、そのアドレスをs
(s
インスタンス/オブジェクトへの参照として)割り当てます
String backup_of_s = s;
新しい変数backup_of_s
を作成し、初期化して、現在参照されているオブジェクトを参照するようにしますs
ます。
注:文字列の不変性は、このオブジェクトが変更されないことを保証します。バックアップは安全です
注2:Javaガベージコレクションメカニズムは、このオブジェクトが少なくとも1つの変数(backup_of_s
この場合)
最後に、s = "bye";
別のStringインスタンスを作成し(不変性のため、これが唯一の方法です)、s
新しいオブジェクトを参照するように変数を変更します。