长整型和双精度浮点型的比较(==)行为不同。
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,因为它比较的是实际的值,而不是内存地址的快速检查。