[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
質問
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
文字列は不変なので、どちらのバージョンも安全です。しかし、後者は効率が悪いです(余分なオブジェクトを作成し、場合によっては文字データをコピーしてしまいます)。
この点を考慮すると、最初のバージョンを優先すべきです。
関連
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] java.lang.UnsupportedClassVersionError を修正する方法。サポートされていないメジャー.マイナーバージョン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】Doubleはdereferencedできない?
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み】非閉鎖文字リテラルエラー
-
[解決済み】文字列中の � を置換する方法
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み】スレッド "main "での例外 java.util.NoSuchElementException
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み】Ubuntu: OpenJDK 8 - パッケージを見つけることができません。
-
[解決済み】javaで無効な文字定数