请帮助我确定将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类中实现hashcodeWrappedString

07-26 04:38