1. ホーム
  2. java

[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?

2022-01-27 07:06:01

質問

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

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

しかし、本当に 安全 このメソッドでStringをコピーするのは(もちろん通常のMutableオブジェクトをコピーするのは安全ではありません)、それともこう書いた方が良いのでしょうか? :

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

つまり、この2つのスニペットは何が違うのか(もし違うなら)?


EDIT - 最初のスニペットが安全である理由。

すでに提供されている良い回答(基本的に2つのスニペットのパフォーマンスの違いの問題に集中していた)をもとに、もう少し詳しく説明しましょう。

Javaでは文字列は不変であり、Stringオブジェクトはその構築後に変更することができないことを意味します。 したがって

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

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

注:文字列不変性とは、このオブジェクトが変更されないことを保証するものです:私たちのバックアップは安全です。

注2:Javaのガベージコレクション機構では、少なくとも1つの変数から参照されている限り、このオブジェクトが破棄されないことが保証されています( {コード この場合)

最後に backup_of_s は別のStringインスタンスを作成し(不変性のため、この方法しかない)、そのインスタンスにある s = "bye";

s

文字列は不変なので、どちらのバージョンも安全です。しかし、後者は効率が悪いです(余分なオブジェクトを作成し、場合によっては文字データをコピーしてしまいます)。

この点を考慮すると、最初のバージョンを優先すべきです。