HashSet存储相等的对象

下面是从对象列表中查找重复对象的代码。 但由于某种原因,hashset甚至存储了相等的对象。

我当然错过了一些东西,但当我检查hashset的大小时,它出来了5。

import java.util.ArrayList; import java.util.HashSet; public class DuplicateTest { public static void main(String args[]){ ArrayList dogList = new ArrayList(); ArrayList duplicatesList = new ArrayList(); HashSet uniqueSet = new HashSet(); Dog a = new Dog(); Dog b = new Dog(); Dog c = new Dog(); Dog d = new Dog(); Dog e = new Dog(); a.setSize("a"); b.setSize("b"); c.setSize("c"); d.setSize("a"); e.setSize("a"); dogList.add(a); dogList.add(b); dogList.add(c); dogList.add(d); dogList.add(e); if(a.equals(d)){ System.out.println("two dogs are equal"); } else System.out.println("dogs not eqal"); for(Dog dog : dogList){ uniqueSet.add(dog); } System.out.println("number of unique dogs="+ uniqueSet.size()); /*for(Dog dog:uniqueSet){ System.out.println("uniqueset ="+dog.getSize()); } for(Dog dog : duplicatesList){ System.out.println("duplicate dog="+dog.getSize()); }*/ } } 

这是狗类

 public class Dog implements Animal, Comparable{ String size; public void makeNoise(){ System.out.println("woof woof"); } public String getSize() { return size; } public void setSize(String size) { this.size = size; } public int compareTo(Dog d){ return this.size.compareTo(d.size); } public boolean equals(Dog d){ return this.size.equals(d.size); } @Override public int hashCode() { // TODO Auto-generated method stub return super.hashCode(); } } 

此代码不能满足您的需要:

 public boolean equals(Dog d){ return this.size.equals(d.size); } 

这不是重写Object.equals,这是HashSet使用的。 你需要:

 @Override public boolean equals(Object d){ if (!(d instanceof Dog)) { return false; } Dog dog = (Dog) d; return this.size.equals(dog.size); } 

请注意,通过使用@Override注释,您要求编译器validation您实际上是否覆盖了方法。

编辑:如上所述,您需要以与equals方法兼容的方式覆盖hashCode 。 鉴于您根据大小检查相等性,最简单的选项是:

 @Override public int hashCode() { return size.hashCode(); }