logo

Javaの不変文字列

String は、アプリケーション プログラムを作成する際に避けられないタイプの変数です。文字列参照は、ユーザー名、パスワードなどのさまざまな属性を保存するために使用されます。Java では、 文字列オブジェクトは不変です 。不変とは、単に変更できない、または変更できないことを意味します。

スキャナJavaをインポートする

String オブジェクトが作成されると、そのデータや状態は変更できませんが、新しい String オブジェクトが作成されます。

以下の例で不変性の概念を理解してみましょう。

Testimmutablestring.java

 class Testimmutablestring{ public static void main(String args[]){ String s='Sachin'; s.concat(' Tendulkar');//concat() method appends the string at the end System.out.println(s);//will print Sachin because strings are immutable objects } } 
今すぐテストしてください

出力:

 Sachin 

さて、それは以下の図で理解できます。ここでは Sachin は変更されませんが、Sachin Tendulkar を使用して新しいオブジェクトが作成されます。これが、String が不変として知られる理由です。

Javaの不変文字列

上の図からわかるように、2 つのオブジェクトが作成されますが、 s 参照変数は依然として「Sachin Tendulkar」ではなく「Sachin」を参照しています。

しかし、これを参照変数に明示的に割り当てると、「Sachin Tendulkar」オブジェクトを参照することになります。

例えば:

Testimmutablestring1.java

 class Testimmutablestring1{ public static void main(String args[]){ String s='Sachin'; s=s.concat(' Tendulkar'); System.out.println(s); } } 
今すぐテストしてください

出力:

 Sachin Tendulkar 

このような場合、s は「サチン テンドゥルカール」を指します。 Sachin オブジェクトはまだ変更されていないことに注意してください。

Java では String オブジェクトが不変であるのはなぜですか?

Java では文字列リテラルの概念が使用されます。 5 つの参照変数があり、すべてが 1 つのオブジェクト「Sachin」を参照しているとします。 1 つの参照変数がオブジェクトの値を変更すると、すべての参照変数の影響を受けます。 Java では String オブジェクトが不変であるのはこのためです。

以下は、String オブジェクトを不変にする String のいくつかの機能です。

1. クラスローダー:

Java の ClassLoader は、String オブジェクトを引数として使用します。 String オブジェクトが変更可能な場合、値が変更され、ロードされるはずのクラスが異なる可能性があることを考慮してください。

この種の誤解を避けるために、String は不変です。

2. スレッドセーフ:

arp-a コマンド

String オブジェクトは不変であるため、複数のスレッド間でオブジェクトを共有する際に必要な同期を行う必要がありません。

3. セキュリティ:

クラスの読み込みで見たように、不変 String オブジェクトは、正しいクラスを読み込むことでさらなるエラーを回避します。これはアプリケーションプログラムの安全性を高めることにつながります。銀行業務ソフトウェアの例を考えてみましょう。 String オブジェクトは不変であるため、侵入者はユーザー名とパスワードを変更できません。これにより、アプリケーション プログラムの安全性を高めることができます。

4. ヒープスペース:

String の不変性は、ヒープ メモリの使用量を最小限に抑えるのに役立ちます。新しい String オブジェクトを宣言しようとすると、JVM はその値が String プールにすでに存在するかどうかを確認します。存在する場合、同じ値が新しいオブジェクトに割り当てられます。この機能により、Java はヒープ領域を効率的に使用できるようになります。

なぜ Java では String クラスが Final なのでしょうか?

String クラスが Final である理由は、誰も String クラスのメソッドをオーバーライドできないためです。これにより、古い String オブジェクトだけでなく新しい String オブジェクトにも同じ機能を提供できます。