ご存知のとおり、Javaはラッパーや文字列型にオブジェクトプールを使用する場合もあれば、使用しない場合もあります。
例えば:
Integer i1 = 1;
Integer i2 = 1;
Integer i3 = new Integer(1);
String s1 = "String";
String s2 = "String";
String s3 = new String ("String");
System.out.println("(i1 == i2) " + (i1 == i2));
System.out.println("(i2 == i3) " + (i2 == i3));
System.out.println("(s1 == s2) " + (s1 == s2));
System.out.println("(s2 == s3) " + (s2 == s3));
Execution result:
(i1 == i2) true
(i2 == i3) false
(s1 == s2) true
(s2 == s3) false
ご覧のとおり、プリミティブのボクシングはプールからオブジェクトを取得しますが、文字列リテラルを介して文字列を作成すると、プールからもオブジェクトが取得されます。このようなオブジェクトは実際には同じオブジェクトです(演算子==はそれらに対してtrueを返します)。
ラッパーと文字列を作成する他のメカニズムは、プールからオブジェクトを取得しません。これらの方法で作成されたオブジェクトは、実際には異なるオブジェクトです(operator ==はそれらに対してfalseを返します)。
私を混乱させるのは、プールが部分的に使用されているという事実です。
メモリの問題である場合は、プールを常に使用してみませんか?それがメモリの問題ではない場合-なぜそれを使用するのですか?
問題は、そのような動作(=プールの部分的な使用)を実装する理由は何ですか?
質問はかなり理論的ですが、実用的なアプリケーションがあります。カスタムオブジェクトプールを正しく使用する方法を理解するのに役立ちます。もちろん、Javaがどのように機能するかを理解することは常に良いことです。