logo

Java で文字列が不変または最終である理由

オブジェクト指向プログラミングでは、 不変の文字列またはオブジェクト 一度作成すると変更することはできません。ただし、変更できるのはオブジェクトへの参照だけです。オブジェクト自体の変更に制限します。の 文字列は不変ですジャワ これは、セキュリティ、同期と同時実行性、キャッシュ、クラスの読み込みのためです。文字列をfinalにする理由は、不変性を破壊し、他の人がそれを拡張できないようにするためです。

String オブジェクトは String プールにキャッシュされ、 不変の文字列 。キャッシュされた文字列リテラルは、複数のクライアントによってアクセスされます。したがって、1 つのクライアントによって実行されるアクションが他のすべてのクライアントに影響を与えるリスクが常に存在します。たとえば、1 つのクライアントがアクションを実行して文字列値を Pressure から PRESSURE に変更すると、残りのすべてのクライアントもその値を読み取ります。パフォーマンス上の理由から、String オブジェクトのキャッシュが重要であるため、そのリスクを取り除くために、String を不変にする必要があります。

Java で文字列が不変または最終である理由

String を不変にするその他の理由は次のとおりです。

JavaScript グローバル変数
  • Java で String が不変でない場合、String プールは使用できません。多くのヒープスペースが節約されます JRE 。同じ文字列変数は、プール内の複数の文字列変数によって参照できます。文字列が不変でない場合、文字列のインターンも可能ではありません。
  • String を不変にしないと、アプリケーションに重大なセキュリティ上の脅威が生じることになります。たとえば、データベースのユーザー名やパスワードは、データベース接続を受信するための文字列として渡されます。の ソケットプログラミング ホストとポートの説明も文字列として渡されます。 String は不変なので、値を変更することはできません。文字列が不変のままではない場合、ハッカーが参照値を変更することでアプリケーションにセキュリティ問題を引き起こす可能性があります。
  • String は不変であるため、マルチスレッドに対して安全です。異なるスレッドが単一の「String インスタンス」にアクセスできます。文字列を暗黙的にスレッドセーフにするため、スレッドセーフのための同期が削除されます。
  • 不変性により、クラスローダーによって正しいクラスをロードするという安全性が得られます。たとえば、java.sql.Connection クラスをロードしようとしたインスタンスがあるが、myhacked.Connection クラスへの参照値の変更によりデータベースに望ましくない動作が行われたとします。

例を通して不変の概念を理解しましょう。

ImmutableString.java

文字列比較Java
 import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } } 

出力:

Java で文字列が不変または最終である理由

説明: 上記の例は、次の図を参照すると理解できます。

Java で文字列が不変または最終である理由

文字列定数プールでは、 こんにちは は変更されず、新しい文字列オブジェクトが作成されます。 こんにちは世界 。これは文字列が不変であることを示しています。参照変数は、 こんにちは ではなく こんにちは世界。

もしそうしたいのであれば、それは こんにちは世界 、その変数に明示的に代入する必要があります。例えば:

決定論的有限オートマトン
 import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } } 

出力:

Java で文字列が不変または最終である理由