Why is Javaamp;#39;s Double.compare(double, double) implemented the way it is?(为什么Javaamp;的Double.Compare(Double,Double)是这样实现的?)
问题描述
我正在研究Java标准库(6)中compare(double, double)的实现。上面写着:
public static int compare(double d1, double d2) {
if (d1 < d2)
return -1; // Neither val is NaN, thisVal is smaller
if (d1 > d2)
return 1; // Neither val is NaN, thisVal is larger
long thisBits = Double.doubleToLongBits(d1);
long anotherBits = Double.doubleToLongBits(d2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1)); // (0.0, -0.0) or (NaN, !NaN)
}
此实现的优点是什么?
编辑:"优点"是一个(非常)糟糕的措辞。我想知道这是如何工作的。
推荐答案
@Shoover的答案是正确的(read it!),但还有更多的原因。
作为Double::equals
的javadoc状态:
假设Java设计者已经决定使用与包装的此定义允许哈希表正常运行。
double
实例上的==
相同的语义来实现equals(...)
和compare(...)
。这意味着对于包装的NaN,equals()
总是返回false
。现在考虑如果您尝试在地图或集合中使用包装的NaN会发生什么情况。
List<Double> l = new ArrayList<Double>();
l.add(Double.NaN);
if (l.contains(Double.NaN)) {
// this wont be executed.
}
Map<Object,String> m = new HashMap<Object,String>();
m.put(Double.NaN, "Hi mum");
if (m.get(Double.NaN) != null) {
// this wont be executed.
}
没什么意义,不是吗!
将存在其他异常,因为-0.0
和+0.0
具有不同的位模式,但根据==
相同。
因此,Java设计人员决定(正确地使用IMO)为我们今天拥有的这些双重方法选择更复杂(但更直观)的定义。
这篇关于为什么Java&;的Double.Compare(Double,Double)是这样实现的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么Java&;的Double.Compare(Double,Double)是这样实现的?
基础教程推荐
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01