Java 为什么双变量的比较返回false?

Java 为什么双变量的比较返回false?,java,string,reference,Java,String,Reference,为什么字符串比较返回true,而双重比较返回false String s1 = "a"; String s2 = "a"; System.out.println(s1 == s2); // true Double d1 = 1D; Double d2 = 1D; System.out.println(d1 == d2); // false 我对这件事有一些想法,但首先听到你的消息总是很高兴。字符串文字是实习的,而自动装箱双打则不是。其他自动装箱可以保证使用缓存对象: Integer i1 =

为什么字符串比较返回true,而双重比较返回false

String s1 = "a";
String s2 = "a";
System.out.println(s1 == s2); // true

Double d1 = 1D;
Double d2 = 1D;
System.out.println(d1 == d2); // false

我对这件事有一些想法,但首先听到你的消息总是很高兴。

字符串文字是实习的,而自动装箱双打则不是。其他自动装箱可以保证使用缓存对象:

Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2); // true, guaranteed
请注意,这仅适用于-128到127之间的值,但也适用于较大的值。有关更多信息,请参阅

请注意,对于字符串而言,这实际上只是因为字符串常量的内部存储:

String s1 = new String("a");
String s2 = new String("a");
System.out.println(s1 == s2); // false
。。。而对于整数装箱,缓存值的重用在执行时执行:


我想这是JLS的一部分,你有参考链接吗?对于答案的完整性:)@jon skeet我喜欢当我点击“刷新”时你的答案不断增长的方式。@ptomil:我刚刚编辑了它以提供参考:)@jon你能告诉我更多关于缓存对象的信息吗?它们是什么?字符串,整数还有什么?他们的规格?@hilal:在这种情况下,它只是在特定范围内装箱的值缓存,以避免每次都必须创建新对象。还有一个问题是字符串常量的内部存储,这与在编译时执行的部分内容略有不同。。。编译器会在类文件中发出对同一常量的引用,即使该常量在类中使用了多次,然后JVM还会在加载该类时检查该字符串是否已经有一个内部值。
int x = 10;
x -= 9;
Integer i1 = x;
Integer i2 = 1;
System.out.println(i1 == i2); // true, guaranteed