HashSet添加重复项

时间:2016-06-04 16:31:15

标签: collections hashset

我正在处理哈希映射。它不允许重复,但在这个程序中它添加了三个项目,根据我应该只添加一个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 } }

2 个答案:

答案 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三次。