当前位置: 首页 > 知识库问答 >
问题:

长和双重比较(==)的行为不同[duplicate]

江宏伟
2023-03-14

当执行下面的代码段时,它对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

为什么Double==的行为与long不同?

共有1个答案

杭柏
2023-03-14
Long v1 = 1L;
Long v2 = 1L;
Double d1 = 1.0;
Double d2 = 1.0;

您在这里创建了对对象的两个引用,并用Java的自动装箱行为实例化了两个对象。

Java为v1和v2重新使用了池中的同一个长对象实例,而Double并不使用池来记忆值,这可以在这篇博客文章https://gerardnico.com/code/type/autoboxing中读到

下面是Java5的一些规则:

自动装箱到Boolean和Byte总是从池中返回对象
自动装箱到Char、Short、Integer和Long时,当自动装箱的值介于-128和127(含)之间时,会从池中返回对象
自动装箱到Float和Double不使用池,总是返回新对象

然后,您的代码会自动装箱(某些池是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库?例如 我开始的每个项目最终都要重新实现,然后粘贴代码并进行测试。 注意,为什么最好使用第三方JAR是IBM的建议一个很好的例子: “如果您不知道基础测量的规模,那么使用测试“ abs(a / b-1)<epsilon”可能比简单比较差异更可靠。” 我怀疑很多人会想到这一点,并说明即使是简单的代码也可能不是最优的。 问题答案: 番石榴有。

  • 为什么Java库中的静态方法for、和的实现不同? 对于: 对于: 对于:

  • 我做错了什么,怎么修复?

  • 我开发了一个程序,它创建一个书籍对象数组,并根据用户输入对它们进行排序。排序选项是author-title-pages-price,除了price排序之外,其他都可以。请帮我找出为什么我不能使用比较器对双打进行排序...我的课本课: 和排序程序:

  • 问题内容: 我写了以下代码: 如果我说有两个双数,则差应为。但是,当我将数字转换为int时,其差异最终为,这是不正确的。 因此,我需要返回一个double而不是一个int。问题是,我的领域是双重的。我怎么解决这个问题? 问题答案: 您不需要返回。 该接口用于为要比较的元素建立排序。具有使用的字段与该顺序无关。 您的代码很好。 抱歉,我错了,再次阅读问题,这是您需要的: