哈希集添加重复项



我正在研究哈希图。它不允许重复,但在这个程序中,它根据我添加了三个项目,它应该只添加一个 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));

////true

System.out.println(hs.add(s1));//true

原因是当您在HashSet上调用add方法时,使用equals()方法将要添加的elementSet的现有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();
    }
}

最新更新