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

2 java string reference

为什么String比较返回true,而Double comparisons返回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
Run Code Online (Sandbox Code Playgroud)

我对此事有一些想法,但总是很高兴先收到你的来信.

Jon*_*eet 10

字符串文字是固定的 - 自动装帧的双打不是.其他自动装箱可以保证使用缓存对象:

Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2); // true, guaranteed
Run Code Online (Sandbox Code Playgroud)

请注意,这只是保证从-128到127的值,但可以为更大的值正常工作.有关更多信息,请参阅JLS的5.1.7节.

请注意,对于字符串,它实际上只是因为String常量的实现:

String s1 = new String("a");
String s2 = new String("a");
System.out.println(s1 == s2); // false
Run Code Online (Sandbox Code Playgroud)

...而对于整数装箱,在执行时执行缓存值的重用:

int x = 10;
x -= 9;
Integer i1 = x;
Integer i2 = 1;
System.out.println(i1 == i2); // true, guaranteed
Run Code Online (Sandbox Code Playgroud)

  • @ jon-skeet当我点击刷新时,我喜欢你的答案不断增长的方式. (3认同)