ホームページ >Java >&#&チュートリアル >Java で String 変数を再割り当てしても元の文字列の値が変わらないのはなぜですか?

Java で String 変数を再割り当てしても元の文字列の値が変わらないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-19 11:55:14464ブラウズ

Why does reassigning a String variable in Java not change the original string's value?

文字列は不変: 概念を理解する

Java では、文字列は不変です。つまり、その内容を直接変更することはできません。ただし、次のようなコードを観察すると、この概念が混乱する可能性があります:

String a = "a";
System.out.println("a 1-->" + a);
a = "ty";
System.out.println("a 2-->" + a);

出力:

a 1-->a  
a 2-->ty

実際に何が起こっているのか?

にもかかわらず新しい値を a に代入すると、出力には元の値が表示されます。この明らかな矛盾は、文字列の不変性から生じます。新しい文字列が参照変数に割り当てられると、新しい文字列オブジェクトが作成され、新しいオブジェクトを指すように参照が更新されます。元の文字列は変更されません。

文字列の仕組み

これをよりよく理解するために、String クラスの機能を調べてみましょう。

  • 文字列の作成: String str = "knowledge" は、値 "knowledge" を持つ文字列オブジェクトを作成し、代入します。
  • 参照の割り当て: String s = str は、同じ文字列オブジェクトを指す新しい参照 s を作成します。
  • 変更の試行: str = str.concat("base ") は概念的に "base" を str に追加しますが、文字列は不変であるため、値 "knowledge Base" を持つ新しい文字列オブジェクトが作成され、参照 str

メモリ管理と文字列定数プール

文字列リテラルはアプリケーションで一般的であり、大量のメモリを占有する可能性があります。メモリ使用量を最適化するために、Java 仮想マシン (JVM) はすべての文字列リテラルを格納する「文字列定数プール」を維持します。文字列リテラルが見つかると、コンパイラーはプール内に既存の一致がないかチェックします。見つかった場合、参照は既存の文字列に送られ、新しいオブジェクトの作成が回避されます。

不変性の重要性

文字列の不変性はメモリ内で重要な役割を果たします。管理。文字列への参照は同じ基礎となるオブジェクトを指すことができるため、1 つの文字列の内容を変更するとすべての参照に影響します。したがって、不変性により、参照が変更された場合でも、元の文字列が確実に保持されます。

文字列クラスのファイナリティ

文字列の不変性を壊す可能性のあるオーバーライドを防ぐために、 String クラスはfinalとマークされています。これは、他のクラスがその動作を継承したり変更したりできないことを意味します。

要約

Java では文字列は不変です。文字列オブジェクトを指す参照変数が再割り当てされると、新しい文字列オブジェクトが作成され、既存のオブジェクトを変更するのではなく参照が効果的に更新されます。不変性はメモリ効率を高め、同じ文字列値を指す参照間の一貫性を確保するために不可欠です。

以上がJava で String 変数を再割り当てしても元の文字列の値が変わらないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。