JavaでStringが不変な理由は?

なぜJavaでStringは変更不可能なのかは、人気のあるインタビューの質問の一つです。Stringは、プログラミング言語の中でも最もよく使用されるクラスの一つです。StringはJavaでは変更不可能でfinalであることを知っています。JavaのランタイムはStringプールを維持しており、これによってStringは特別なクラスとなっています。

なぜJavaでStringは変更不可能なのでしょうか?

Stringの変更不可能性の利点をいくつか見てみましょう。これによって、なぜStringがJavaでは変更不可能なのかを理解するのに役立ちます。

  1. Stringプールは、JavaでStringが変更不可能なために可能になっています。これにより、異なるString変数がプール内の同じString変数を参照できるため、Javaランタイムは多くのヒープスペースを節約することができます。もしStringが変更可能であれば、Stringのインターニングは不可能であり、変数の値が変更されると他の変数にも反映されることになります。
  2. もしStringが不変でない場合、アプリケーションに重大なセキュリティ上の脅威をもたらす可能性があります。たとえば、データベースのユーザー名やパスワードは、データベース接続を取得するためにStringとして渡され、ソケットプログラミングではホストとポートの詳細がStringとして渡されます。Stringは不変であるため、その値を変更することはできません。もしハッカーが参照された値を変更できれば、アプリケーション内でセキュリティの問題を引き起こす可能性があります。
  3. Stringが不変であるため、マルチスレッドで安全です。単一のStringインスタンスは異なるスレッド間で共有することができます。これにより、スレッドセーフのための同期の使用が不要になります。Stringは暗黙的にスレッドセーフです。
  4. StringはJavaクラスローダーで使用され、不変性により、正しいクラスがClassloaderによってロードされることが保証されます。たとえば、java.sql.Connectionクラスをロードしようとしている場合、参照された値がmyhacked.Connectionクラスに変更されると、データベースに望ましくない操作を行う可能性があります。
  5. Stringは不変であるため、作成時にそのハッシュコードがキャッシュされ、再計算する必要がありません。これにより、StringはMapのキーとして優れた候補となり、他のHashMapのキーオブジェクトよりも処理が高速化されます。これがStringがHashMapキーとして最も広く使用されている理由です。

上記は、文字列の不変性の利点を示すために考えられるいくつかの理由です。これは、JavaのStringクラスの素晴らしい機能であり、特別なものです。この記事を読んで、自分自身の不変クラスを作成する方法を知ることができます。

JavaのStringのさらなる例は、私たちのGitHubリポジトリからチェックアウトできます。

Source:
https://www.digitalocean.com/community/tutorials/string-immutable-final-java