长整型和双精度浮点型的比较(==)行为不同。

30 浏览
0 Comments

长整型和双精度浮点型的比较(==)行为不同。

当执行以下代码片段时,对于Double类型的变量,它的行为与Long类型的变量不同。\n为什么Double的“==”的行为与Long不同?

0
0 Comments

Long和Double类型之间的比较在使用"=="操作符时表现出不同的行为。这个问题的出现是因为Java的自动装箱机制。在上述代码中,我们创建了两个对象的引用,并使用Java的自动装箱机制实例化了两个对象。

Java在v1和v2中重用了同一个Long对象实例,而Double类型并不会使用一个池来记住值。具体的规则如下:

- 自动装箱为Boolean和Byte类型时,总是从池中返回一个对象

- 自动装箱为Char、Short、Integer和Long类型时,只有在值介于-128到127之间时,才从池中返回一个对象

- 自动装箱为Float和Double类型时,不使用池,总是返回一个新的对象

根据以上规则,我们可以将代码转换为下面的形式(SomePoolJavaUses是一个Java使用的池的可视化表示):

class SomePoolJavaUses {
   static Long _l1 = new Long(1L);
   static Long _l2 = new Long(2L);
   static Long _l3 = new Long(3L);
   ...
}
Long v1 = SomePoolJavaUses._l1;
Long v2 = SomePoolJavaUses._l1;
Double d1 = new Double(1.0);
Double d2 = new Double(1.0);

这意味着d1和d2不是相同的实例,所以它们在使用"=="比较时不相等。

而v1和v2是相同的实例,所以它们在使用"=="比较时相等。

v1.equals(v2)返回true,因为它比较的是实际的值,而不是内存地址的快速检查。

0