本文介紹了為什么Java&;的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)是這樣實現的?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,