请帮助我确定将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类型的两个实例(一个实例)只是存储,虽然它们是两个不同的对象)?
答案 0 :(得分:5)
主要区别在于String
实施equals
而WrappedString
则没有。因此,从HashSet角度来看,您可以根据需要添加任意数量new String("aardvark")
,它们将被视为相同(因为new String("aardvark").equals(new String("aardvark"))
为真)并且只会添加一个。
虽然两个不同的WrappedString
实例不相等,即使它们包含的字符串相等(因为new WrappedString("aardvark").equals(new WrappedString("aardvark"))
为false),因此该集合不会将它们视为重复。
如果您想要一种类似于String
的行为,则需要在equals
课程中实施hashcode
和WrappedString
。
答案 1 :(得分:0)
在WrappedString类中覆盖equals
和hashcode
方法,然后它将按照您期望的方式运行。即使这些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方法,因此地址被比较并且两个实例不相等 - 因此它们都被插入到集合中。