将WrappedString和String添加到HashSet之间的区别

时间:2013-03-14 12:42:46

标签: java collections hashset

请帮助我确定将WrappedString添加到hashSet之间的区别:

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");
 hs.add(ws1); hs.add(ws2);
 System.out.println(hs.size()); // outputs 2

   }

}

以及以下内容:

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>();
 String s1 = new String("aardvark");
 String s2 = new String("aardvark");
 hs.add(s1); hs.add(s2);
 System.out.println(hs.size()); // outputs 1
   }

}

我知道任何对象只存在于hashSet内部,并且类型WrappedString的两个实例被认为是不同的变量,尽管它们具有相同的值但是为什么它以不同的方式处理String类型的两个实例(一个实例)只是存储,虽然它们是两个不同的对象)?

3 个答案:

答案 0 :(得分:5)

主要区别在于String实施equalsWrappedString则没有。因此,从HashSet角度来看,您可以根据需要添加任意数量new String("aardvark"),它们将被视为相同(因为new String("aardvark").equals(new String("aardvark"))为真)并且只会添加一个。

虽然两个不同的WrappedString实例不相等,即使它们包含的字符串相等(因为new WrappedString("aardvark").equals(new WrappedString("aardvark"))为false),因此该集合不会将它们视为重复。

如果您想要一种类似于String的行为,则需要在equals课程中实施hashcodeWrappedString

答案 1 :(得分:0)

在WrappedString类中覆盖equalshashcode方法,然后它将按照您期望的方式运行。即使这些obejcts包含相同的字符串对象,WrappedString也是不同的对象。 添加hashcode和equals如下所示。

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");
        hs.add(ws1);
        hs.add(ws2);
        System.out.println(hs.size()); // outputs 2

    }
    @Override
    public boolean equals(Object obj) {
        WrappedString ws = (WrappedString)obj;
        return this.s.equals(ws.s);
    }
    @Override
    public int hashCode() {
        return this.s.hashCode();
    }

}

现在hashset的大小为1。

答案 2 :(得分:0)

考虑'等于'方法。对于字符串:new String("aardvark").equals(new String("aardvark"))将返回true,并且哈希集不会添加两个相等的实例。 在您的包装器上,您没有实现equals方法,因此地址被比较并且两个实例不相等 - 因此它们都被插入到集合中。