请参阅下面的代码。
“Double”(上部D)用于HashSet,“double”用于x1,x2和x3。将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
答案 0 :(得分:2)
尝试这样来理解差异:
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
基本上doubles已签名,0 / -1将被评估为-0.0而不是0.0 x1或x2。
答案 1 :(得分:0)
HashSet<E>
不同, List<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 : different double and Double in comparison
通常会将其写为Set<Double> hs = new HashSet<>();
请注意,仅支持在Java 7+中使用Diamond Operator。您可以在此处阅读更多内容What is the point of the diamond operator in Java 7?。