Java文字列は不変であり、同じ値で複数の文字列をインスタンス化すると、同じオブジェクトポインタが返されます。(これには用語がありますか?「プーリング」は適切なようですが、それはすでに、インスタンス化を少なくして時間を節約するためにキャッシュを実行することを指します。)
Javaは、不変である他の(ユーザー定義の)クラスでもこれ(用語のないもの)を実行しますか?Javaはクラスが不変であることを検出することさえできますか、それともこれは文字列クラスに固有のものですか?
Java文字列は不変であり、同じ値で複数の文字列をインスタンス化すると、同じオブジェクトポインタが返されます。(これには用語がありますか?「プーリング」は適切なようですが、それはすでに、インスタンス化を少なくして時間を節約するためにキャッシュを実行することを指します。)
Javaは、不変である他の(ユーザー定義の)クラスでもこれ(用語のないもの)を実行しますか?Javaはクラスが不変であることを検出することさえできますか、それともこれは文字列クラスに固有のものですか?
に関して。文字列、あなたが探している単語はインターンです。
Javaは、独自の不変オブジェクトに対してこれを行いません。ただし、ボックス化されたプリミティブのキャッシュバージョンはあります。詳細については、ラッパークラスのキャッシュに関するこの記事を参照してください。
ここで他の人が言っているように、文字列を使用したこのプロセスはインターンとして知られています。
同じリテラル値が同じオブジェクトである文字列の動作は、Java 7では真である場合とそうでない場合があります。7以降:
JDK 7では、インターンされた文字列はJavaヒープの永続的な世代では割り当てられなくなりましたが、代わりに、アプリケーションによって作成された他のオブジェクトとともに、Javaヒープの主要部分(若い世代と古い世代として知られています)に割り当てられます。 。この変更により、メインのJavaヒープに存在するデータが増え、永続生成のデータが少なくなるため、ヒープサイズの調整が必要になる場合があります。ほとんどのアプリケーションでは、この変更によりヒープ使用量に比較的小さな違いしか見られませんが、多くのクラスをロードしたり、String.intern()メソッドを多用する大規模なアプリケーションでは、より大きな違いが見られます。
詳細については、Java SE7RFEを参照してください。
独自の不変オブジェクトに関して、Javaはそれらに対して特別なことは何もしません-それらが不変であることを知りません。価値のある/可能性があることを検出できれば、メソッドをインライン化する可能性がありますが、コンパイラーとJVMに関する限り、それらは単なる別のオブジェクトです。
あなたが探している用語は繰り返されています。Javaは、コンパイル中に文字列を「自動的に」最適化し、開発者が実行時にそれを実行できるようにします。(JVMのバージョンに依存する場合に最適化されるものの詳細。)
これまでのところ、不変オブジェクトに当てはまります。私は、Javaが同じインスタンスを解決するあらゆるタイプのメカニズムをサポートしているとは思いません。文字列型はこの規則の例外ではありません。
理由はnew
、インスタンスを作成するために演算子を使用する必要があるためです。new
文字列インスタンスの作成に使用する場合、常に2つの異なるオブジェクトを取得します。
インターンは文字列型でのみ使用できます。ただし、概念は無料です。不変クラスにそのようなメソッドを追加して、同じことを行うcompledメソッドを作成できます。
文字列インターン。ウィキペディア:文字列インターン
文字列インターニングは、文字列クラスにのみ固有です。JVMは、ユーザー定義のクラスにこれらのルールを適用しないと思います。