请帮助我确定将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类型的两个实例却有所不同(尽管只存储了一个实例,是两个不同的对象)? 最佳答案
主要区别在于String
实现了equals
,而您的WrappedString
没有。因此,从HashSet角度来看,您可以根据需要添加任意多个new String("aardvark")
,它们都将被视为相同(因为new String("aardvark").equals(new String("aardvark"))
为true),并且只会添加一个。
尽管两个不同的WrappedString
实例将不相等,即使它们包含的字符串相等(因为new WrappedString("aardvark").equals(new WrappedString("aardvark"))
为false),所以该集合也不会将它们视为重复项。
如果您想要类似于String
的行为,则需要在equals
类中实现hashcode
和WrappedString
。