@Shoover的答案是正确的(阅读它!),但是它还不止于此。
由于javadoc中的
Double::equals规定:
“此定义允许哈希表正常运行。”
假设Java设计者决定采用
equals(...)与包装实例
compare(...)相同的语义来实现。这意味着将始终返回包装好的NaN。现在考虑如果您尝试在地图或集合中使用包装的NaN会发生什么。
==``double``equals()``false
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)决定了当今我们对这些Double方法更复杂(但更直观)的定义。



