なぜJavaでは文字列は不変であるのか?
なぜJavaにおいてStringは不変(immutable)なのかは、人気のある面接質問の一つです。Stringは、どんなプログラミング言語でも最もよく使用されるクラスの一つです。JavaではStringが不変でfinalであることを知っています。Javaランタイムは、特別なクラスとなるようにStringプールを維持しています。
なぜJavaでStringは不変(immutable)なのか?
-
- JavaにおけるStringは不変(immutable)であるため、文字列プールが可能です。「文字列プール」とは、異なる文字列変数がプール内の同じ文字列変数を参照できる仕組みであり、Javaのランタイムはこれにより多くのヒープ領域を節約することができます。もしStringが不変でなかった場合、文字列のインターニング(プールへの追加)も不可能となっていたでしょう。なぜなら、もし変数の値が変更された場合、他の変数にも反映されるからです。
Stringが不変でない場合、アプリケーションへの深刻なセキュリティ上の脅威になります。例えば、データベースのユーザー名やパスワードはStringとして渡され、ソケットプログラミングではホストやポートの詳細もStringとして渡されます。Stringが不変であるため、値を変更することはできません。もしハッカーが参照された値を変更できたら、アプリケーション内でセキュリティ上の問題が発生してしまいます。
Stringが不変であるため、マルチスレッドで安全に使用することができます。単一のStringインスタンスは異なるスレッド間で共有することができます。これにより、スレッドセーフのための同期処理を避けることができます。Stringは暗黙のうちにスレッドセーフです。
StringはJavaのクラスローダーで使用され、不変性により正しいクラスがClassloaderによって読み込まれることが保証されます。たとえば、java.sql.Connectionクラスをロードしようとしている状況を考えてみましょう。しかし、参照された値がmyhacked.Connectionクラスに変更されてしまうと、データベースに望ましくない操作が行われる可能性があります。
Stringが不変であるため、ハッシュコードは作成時にキャッシュされ、再計算する必要がありません。これにより、StringはMapのキーとして優れた候補となり、他のHashMapキーオブジェクトよりも処理が高速化されます。これがStringが最も広くHashMapのキーとして使用される理由です。
上記は、文字列の不変性の利点を示すいくつかの理由の一部です。これはJavaのStringクラスの素晴らしい機能であり、それを特別なものにしています。自分自身の不変クラスを作成する方法については、この記事を読んでください。
私たちのGitHubリポジトリから、さらに多くのJavaの文字列の例をチェックすることができます。