![](/img/trans.png)
[英]Uniqueness of hashcode for Java's HashSet<Double> and its subsets
[英]“double, Double, HashSet” in Java
請參見下面的代碼。
HashSet中使用“ Double”(上D),而x1,x2和x3使用“ double”。 在將x1添加到HashSet之后,無法添加x2,但是可以添加x3! 為什么??????
提前致謝 :)
HashSet<Double> hs = new HashSet<Double>();
double x1, x2, x3;
x1 = (double)0/1;
System.out.println(hs.add(x1)); //true
x2 = (double)0/2;
System.out.println(hs.add(x2)); //false
x3 = (double)0/-1;
System.out.println(hs.add(x3)); //true
並且,如果為x1,x2和x3添加“ 0.0 +”,則結果如下。
x1 = 0.0 + (double)0/1;
System.out.println(hs.add(x1)); //true
x2 = 0.0 + (double)0/2;
System.out.println(hs.add(x2)); //false
x3 = 0.0 + (double)0/-1;
System.out.println(hs.add(x3)); //false
嘗試一下以了解差異:
HashSet<Double> hs = new HashSet<Double>();
double x1, x2, x3;
x1 = (double)0/1;
System.out.println(x1 + " "+ hs.add(x1)); //true
x2 = (double)0/2;
System.out.println(x2 + " " + hs.add(x2)); //false
x3 = (double)0/-1;
System.out.println(x3 + " " + hs.add(x3)); //true
基本上雙精度符號是有符號的,並且x1或x2將0 / -1的值計算為-0.0而不是0.0。
與List<E>
不同, HashSet<E>
僅允許唯一值。
x1 = (double)0/1;
等於0.0
,與x2 = 0.0 + (double)0/2;
。 而x3 = (double)0/-1;
等於-0.0
。 這就是為什么您可以添加第一個和第三個元素而不添加第二個元素的原因。
什么時候使用HashSet? List
的優點是什么?
我已經在這里建議您閱讀HashSet vs. List performance了 。
您的代碼中的一些小事情。
我認為沒有理由將Double和Double混為一談,堅持閱讀以便於閱讀。 Java:不同的double和Double的比較
通常將其寫為Set<Double> hs = new HashSet<>();
請注意,僅在Java 7+中支持使用Diamond運算符。 您可以在此處閱讀更多內容。Java 7中diamond運算符的作用是什么? 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.