我正在研究哈希图。它不允许重复,但在这个程序中,它根据我添加了三个项目,它应该只添加一个 bcz 其余部分是相同的。
import java.util.*;
public class WrappedString {
private String s;
public WrappedString(String s) { this.s = s; }
public static void main(String[] args) {
HashSet<Object> hs = new HashSet<Object>();
WrappedString ws1 = new WrappedString("aardvark");
WrappedString ws2 = new WrappedString("aardvark");
String s1 = new String("aardvark");
String s2 = new String("aardvark");
System.out.println(hs.add(ws1)); //true
System.out.println(hs.add(ws2)); ////true
System.out.println(hs.add(s1)); //true
System.out.println(hs.add(s2)); //false
System.out.println(hs.size());//3 } }
在你的问题中:
System.out.println(hs.add(ws1));//true
System.out.println(hs.add(ws2));
////trueSystem.out.println(hs.add(s1));//true
原因是当您在HashSet
上调用add
方法时,使用equals()
方法将要添加的element
与Set
的现有elements
进行检查。这里的ws1
不等于ws2
,也没有一个不等于s1
。所以你看到true
三次。
发生这种情况是因为包装字符串不像"正常"字符串那样工作。然后我建议你使用字符串。
它将返回假:
new WrappedString("test").equals(new WrappedString("test"))
它将返回 true:
new String("aardvark").equals(new String("aardvark"))
如果结果返回 false,则哈希集将像新项目一样添加。
或者,如果您不更改为字符串,则可以覆盖 WrappedString 的 equals 和 hashSet 确定在比较时差异在哪里,执行以下操作:
public class WrappedString {
private String s;
public WrappedString(String s) {
this.s = s;
}
@Override
public boolean equals(Object obj) {
WrappedString ws = (WrappedString)obj;
return this.s.equals(ws.s);
}
@Override
public int hashCode() {
return this.s.hashCode();
}
}