众所周知,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
正如您所见,原语装箱从池中获取对象,通过字符串文字创建字符串也从池中获取对象。这样的对象实际上是同一个对象(operator ==返回 true )。
创建包装器和字符串的其他机制不会从池中获取对象。以这些方式创建的对象实际上是不同的对象(运算符==在它们上返回 false)。
让我感到困惑的是游泳池被部分使用的事实。
如果是内存问题,为什么不一直使用池?如果它不是内存问题 - 为什么要使用它?
问题是 - 实现这种行为的原因是什么(= 池的部分使用)?
这个问题相当理论化,但它有实际应用——它可以帮助理解如何正确使用自定义对象池,当然理解 Java 的工作原理总是好的。