HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다.
HashSet은 저장순서를 유지하지 않으므로 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다.
HashSet의 add메서드는 새로운 요소를 추가하기 전에 기존에 저장된 요소와 같은 것인지 판별하기 위해 추가하려는 요소의 equals()와 hashCode()를 호출하기 때문에 equals()와 hashCode()를 목적에 맞게 오버라이딩해야 한다.
class HashSetEx4 { HashSet set = new HashSet(); set.add(new String("abc")); set.add(new String("abc")); set.add(new Person2("David", 10)); set.add(new Person2("David", 10)); System.out.println(set); }
Class Person2 { String name; int age; Person2(String name, int age) { this.name = name; this.age =age; } public boolean equals(Object obj) { if (obj instanceof Person2) [ Person2 tmp = (Person2)obj; return name.equals(tmp.name) && age == tmp.age; } return false; } public int hashCode() { return (name + age).hashCode(); } public String toString() { return name + ":" + age; } }
String 클래스에서 같은 내용의 문자열에 대한 equals()의 호출결과가 true인 것과 같이, Person2클래스에서도 두 인스턴스의 name과 age가 같으면 true를 반환하도록 equals()를 오버라이딩했다. 그리고 hashCode()는 String클래스의 hashCode()를 이용해서 구현했다.