我正在处理哈希映射。它不允许重复,但在这个程序中它添加了三个项目,根据我应该只添加一个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 } }
答案 0 :(得分:0)
之所以发生这种情况,是因为 WrappedString 无法像“普通” 字符串 那样工作。然后我建议你使用String。
返回false :
new WrappedString("test").equals(new WrappedString("test"))
返回true :
new String("aardvark").equals(new String("aardvark"))
如果结果返回false,则HashSet将添加为新项目。
或者,如果你不改变为String,你可以覆盖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();
}
}
答案 1 :(得分:0)
在你的问题中:
的System.out.println(hs.add(WS1)); //真
的System.out.println(hs.add(WS2)); ////真
的System.out.println(hs.add(S1)); //真
原因是当您在add
上调用HashSet
方法时,使用element
的现有elements
检查您要添加的Set
{ {1}}方法。此处equals()
不等于ws1
,并且它们都不等于ws2
。所以你看了s1
三次。