Default implementation of equals() method provided by java.lang.Object compares memory location and only return true if two reference variable are pointing to same memory location. equals() method used to avoid duplicates on HashSet.
The problem is that you didn't override the equals() and hash() methods.
A common source of bugs is the failure to override the hashCode method. You must override hashCode in every class that overrides equals. Failure to do so will result in a violation of the general contract for Object.hashCode, which will prevent your class from functioning properly in conjunction with all hash-based collections, including HashMap, HashSet, and Hashtable. [Effective Java]
import java.util.*;
public class HashSetTest {
public static class Dummy {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Dummy)) return false;
Dummy dummy = (Dummy) o;
if (age != dummy.age) return false;
if (name != null ? !name.equals(dummy.name) : dummy.name != null) return false;
return true;
}
@Override
public int hashCode() {
int result = age;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
@Override
public String toString() {
return String.format("age:%d, name:%s", age, name);
}
}
public static void main(String[] args) {
Dummy dummy01 = new Dummy();
dummy01.setAge(14);
dummy01.setName("XXXX");
Dummy dummy02 = new Dummy();
dummy02.setAge(15);
dummy02.setName("YYYY");
Dummy dummy03 = new Dummy();
dummy03.setAge(14);
dummy03.setName("XXXX");
List<Dummy> dummies = new ArrayList<Dummy>();
dummies.add(dummy01);
dummies.add(dummy02);
dummies.add(dummy03);
Set<Dummy> uniqueDummies = new HashSet<Dummy>();
for (Dummy dummy : dummies) {
uniqueDummies.add(dummy);
}
System.out.println(uniqueDummies);
}
}
Dummyclass implement.equals()and.hashCode()?.addAll(list)to theSetand use this instead of your current code? Also,HashSetdoes not respect insertion order upon iteration.Object's.equals()and.hashCode(), which is not what you want (basically, twoObjects are equal only if they are the same reference; not what you want)