chanhee01 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()를 구현해야 한다.