C#、Java、Pythonなど、いくつかの言語がこれを選択しています。メモリの節約やcompareなどの操作の効率を上げることを目的としている場合、連結やその他の変更操作にどのような影響がありますか?
不変タイプは一般的に良いことです:
その結果、文字列を不変にするのはかなり合理的な言語設計の選択です。
一部の言語(特にHaskellやClojureなどの関数型言語)はさらに進化し、ほとんどすべてを不変にしています。この 啓発的なビデオ は、不変性の利点に興味がある場合、一見の価値があります。
不変の型には、いくつかのマイナーな欠点があります。
ただし、全体として、不変性の利点は、マイナーな欠点をはるかに上回ります。パフォーマンスのみに関心がある場合でも、並行処理の利点とコピーの安さにより、一般に、不変文字列はロックと防御コピーを備えた可変文字列よりもはるかにパフォーマンスが高くなります。
これは主にプログラミングエラーを防ぐためのものです。たとえば、文字列はハッシュテーブルのキーとして頻繁に使用されます。変更できると、ハッシュテーブルが破損します。これは、使用中にデータの一部が変更されると問題が発生する例の1つにすぎません。セキュリティはもう1つです。ユーザーが要求した操作を実行する前に、特定のパスにあるファイルへのアクセスがユーザーに許可されているかどうかを確認する場合、パスを含む文字列は変更できないほうがいいです...
マルチスレッディングを行う場合はさらに重要になります。不変データはスレッド間で安全にやり取りできますが、可変データは無限の頭痛の種です。
基本的に、不変データは、その上で動作するコードを推論しやすくします。これが、純粋に関数型の言語がすべてを不変にしようとする理由です。
Java In Stringだけでなく、すべてのプリミティブWrapperクラス(Integer、Double、Characterなど)は不変です。正確な理由はわかりませんが、これらはすべての基本的なデータ型であると思いますプログラミングスキームは機能します。それらが変更されると、状況が乱れる可能性があります。具体的には、例として、リモートホストへのソケット接続を開いたとします。ホスト名は文字列、ポートは整数になります。 。接続の確立後にこれらの値が変更された場合はどうなりますか?.
パフォーマンスに関する限り、Javaは、スタックまたはヒープからではなく、リテラルプールと呼ばれる個別のメモリセクションからこれらのクラスにメモリを割り当てます。リテラルプールはインデックスが付けられており、文字列を使用する場合 "文字列 "を2回使用すると、リテラルプールの同じオブジェクトを指します。
文字列を不変にすると、以前に作成した文字列のプールから同じ/類似の文字列を簡単に利用できるため、新しい文字列を簡単に参照できます。これにより、新しいオブジェクトの作成コストを削減できます。