-
HashSetJAVA/컬렉션 프레임워크 2023. 8. 3. 22:25
Set 인터페이스를 구현한 가장 대표적인 컬렉션
HashSet은 중복된 요소를 저장하지 않는다.
HashSet에서 중요한 것은 hashCode를 이용한다는 것이다.
public class Main { public static void main(String[] args) { HashSet set = new HashSet(); set.add("aaa"); set.add("aaa"); set.add(new Person("Kim", 20)); set.add(new Person("Kim", 20)); System.out.println(set); } static class Person { String name; int age; Person (String name, int age) { this.name = name; this.age = age; } public String toString() { return name +":" + age; } } }
중복은 허용하지 않는 set인데, Kim:20이라는 객체가 2번이나 저장되었다. 이러한 이유는 각각의 객체의 hashCode가 다르기 때문이다.
equals(), hashCode() 오버라이딩
public class Main { public static void main(String[] args) { HashSet set = new HashSet(); set.add("aaa"); set.add("aaa"); set.add(new Person("Kim", 20)); set.add(new Person("Kim", 20)); System.out.println(set); } static class Person { String name; int age; Person (String name, int age) { this.name = name; this.age = age; } public String toString() { return name +":" + age; } public boolean equals(Object obj) { if(obj instanceof Person) { Person tmp = (Person) obj; return name.equals(tmp.name) && age == tmp.age; } return false; } public int hashCode() { return Objects.hash(name, age); } } }
기존에 저장된 요소와 같은 것인지 확인해주기 위해 equals()와 hashCode()를 오버라이딩 해줬다.
equals를 통해 두 인스턴스의 name과 age 값이 서로 같으면 true를 반환하도록 해줬다. hashCode()는 String 클래스의 hashCode()를 구현했다.
HashSet은 3가지 조건을 충족해야한다.
- 동일한 객체는 동일한 hashCode를 갖는다.
- 다른 객체는 동일한 hashCode를 가지면 안된다.
- 동일한 객체 A, B는 여러번 실행했을 때 다른 hashCode를 가져도 되지만 A == B를 무조건 지켜야한다. (첫 번째 실행시 A = 111, B = 111 / 두 번째 실행시 A = 222, B = 222 처럼)
위에서는 간단한 예제여서 섬세하게 구현하지는 않았지만 원래는 3가지 조건을 충족하는 hashCode()를 구현해야 한다.
'JAVA > 컬렉션 프레임워크' 카테고리의 다른 글
HashMap (0) 2023.08.04 TreeSet (0) 2023.08.03 Stack, Queue (Priority Queue와 deque 포함) (0) 2023.08.03 ArrayList와 LinkedList (0) 2023.08.03