gpt4 book ai didi

java - Long 和 Double 比较 (==) 的行为不同

转载 作者:行者123 更新时间:2023-12-02 08:00:12 25 4
gpt4 key购买 nike

执行以下代码片段时,Double 的行为有所不同。

Long v1 = 1L;
Long v2 = 1L;
Double d1 = 1.0;
Double d2 = 1.0;

System.out.println(v1 == v2); // Prints true
System.out.println(d1 == d2); // Prints false

System.out.println(v1.equals(v2)); // Prints true
System.out.println(d1.equals(d2)); // Prints true

为什么要加倍==与 Long 的行为不同?

最佳答案

Long v1 = 1L;
Long v2 = 1L;
Double d1 = 1.0;
Double d2 = 1.0;

您将在此处创建两个对象引用,并使用 Java 的自动装箱行为实例化两个对象。

Java 在 v1 和 v2 中重复使用池中的相同 Long 对象实例,Double 不使用池来记住值,如可以在这篇信息丰富的博客文章 https://gerardnico.com/code/type/autoboxing 中阅读的那样。

Here are some rules as with Java 5 :

autoboxing to Boolean and Byte always returns an object from the pool
autoboxing to Char, Short, Integer and Long returns an object from the pool when the autoboxed value is between -128 and 127 (inclusive)
autoboxing of Float and Double does not use the pool and always returns a new object

然后你的代码就变成了自动装箱(某些池是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 返回 true,因为正在查看那里的实际值,而不是快速检查内存地址是否相同。

关于java - Long 和 Double 比较 (==) 的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59987745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com