2013-02-22 4 views
9

Java文字列は不変であり、同じ値を持つ複数の文字列をインスタンス化すると、同じオブジェクトポインタが返されます。 (「プールする」という言葉は合っているようですが、すでにインスタンス化を減らして時間を節約するためのキャッシングを指しています)Javaは不変オブジェクトを最適化しますか?

Javaはこれもユーザー定義の)クラスは不変ですか? Javaがクラスが不変であることを検出することさえできますか?これは文字列クラスに固有のものですか?

+0

+1興味深い質問です。私は、Javaが最終メンバーだけを持つクラスを認識し、それらを不変として扱うことができると確信していますが、それに関する正確な情報はありません。私はこの質問に目を向けるでしょう。ありがとうございます – gd1

+2

とにかく、不変のオブジェクトを反射で変更した場合、どうなるか考えてください。 – harold

+0

私はそれについて少し驚いています。ありがとうございます – gd1

答えて

7

Wrt。文字列、あなたが探している言葉はinterningです。

Javaはあなたの不変オブジェクトのためにこれを行いません。しかし、それはボックス化されたプリミティブのキャッシュバージョンを持っています。詳細はwrapper class cachingのこの記事を参照してください。

0

文字列インターナショナルです。ウィキペディア:String Interning

0

文字列インターンはStringクラスにのみ固有です。私は、JVMはユーザー定義のクラスに対してこれらのルールを適用しないと考えています。

1

あなたが探している言葉は耳を傾けています。 Javaはコンパイル時に文字列を「自動的に」最適化し、実行時に開発者に実行可能にします。 (JVMのバージョンに依存しているときに最適化されるものの詳細)

これまでのところ、変更不能なオブジェクトが対象です。私は、Javaが同じinstaceを解決するあらゆるタイプのメカニズムをサポートしているとは思わない。文字列型はこのルールの適用除外ではありません。

理由は、インスタンスを作成するために演算子newを使用する必要があるからです。 newを使用して文字列インスタンスを作成すると、常に2つの異なるオブジェクトが作成されます。

interingはString型でのみ使用できます。しかし、コンセプトは自由です。あなたは、そのようなメソッドをあなたの不変クラスに追加し、同じことをするcompledメソッドを書くことができます。

2

ここで他の人がこのプロセスを言いましたが、Stringsはインターンとして知られています。

その同じリテラル値が同じオブジェクトであると文字列の動作はや7以降からのJava 7に真実であってもなくてもよいことを言及する価値:JDK 7では、インターン

文字列がされなくなりましたJavaヒープの永続的な世代に割り当てられますが、アプリケーションによって作成される他のオブジェクトとともに、Javaヒープの主要部分(若い世代および古い世代として知られる)に割り当てられます。この変更により、メインJavaヒープに多くのデータが格納され、永続的な世代ではデータが少なくなるため、ヒープサイズの調整が必要になることがあります。ほとんどのアプリケーションでは、この変更によりヒープ使用量の差はごくわずかですが、多くのクラスを読み込んだり、String.intern()メソッドを大量に使用しているアプリケーションが多いほど、大きな違いが見られます。

詳しくはJava SE 7 RFEをご覧ください。

あなた自身の変更不能なオブジェクトに関しては、Javaでは何も特別なことをしません。不変であることは分かりません。それが価値ある/可能であることを検出できればそれよりももう少し多くのインラインメソッドがありますが、コンパイラとJVMは単なる別のオブジェクトです。

+2

うわー、downvoted?私はdownvoteを取ることができますが、理由を知っていいだろう –