当执行下面的代码段时,它对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不同?
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排序之外,其他都可以。请帮我找出为什么我不能使用比较器对双打进行排序...我的课本课: 和排序程序:
问题内容: 同时执行: 我目前正在学习do-while vs while,并且想用while重写上面的java片段(已经声明和初始化)。以下重写的代码是否正确: 而: 干杯 问题答案: 之间的区别和是 当 比较完成。使用,您将在最后进行比较,因此至少要进行一次迭代。 您的示例的等效代码 等效于: 一般理解 甲环是一个 出口控制的循环 ,这意味着它离开末。甲环是一个 条目控制的循环 ,这意味着该条件