ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HashSet
    JAVA/컬렉션 프레임워크 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
Designed by Tistory.