본문 바로가기
Java Study

HashSet과 HashMap

by xogns93 2024. 7. 18.

HashSet과 HashMap

 

HashSet과 HashMap은 자바 컬렉션 프레임워크에서 데이터를 저장하고 관리하는 데 사용되는 두 가지 주요 클래스입니다. 두 클래스 모두 해시 테이블 기반의 데이터 구조를 사용하지만, 그 목적과 사용 방식은 다릅니다.

 

해쉬코드 (hashCode)

해쉬코드는 객체를 식별하기 위한 정수 값입니다. 자바에서 모든 객체는 hashCode( ) 메서드를 가지고 있으며, 이 메서드는 객체의 메모리 주소를 기반으로 한 정수 값을 반환합니다. 해쉬코드는 객체를 해쉬맵이나 해쉬셋 같은 해쉬 기반의 컬렉션에 저장하거나 검색할 때 사용됩니다. 동일한 객체는 동일한 해쉬코드를 가져야 하고, 동일하지 않은 객체는 가능한 서로 다른 해쉬코드를 가져야 합니다.


 

HashSet

HashSet은 집합(Set) 인터페이스를 구현한 클래스로, 중복 요소를 허용하지 않는 데이터 구조(data structuers)입니다. 이는 주로 유일한 값들의 집합을 저장하고 관리하는 데 사용됩니다. 내부적으로 HashSet은 HashMap을 사용하여 요소를 저장합니다.

주요 특징

  • 중복 불허: 동일한 요소를 두 번 저장할 수 없습니다.
  • 순서 없음: 요소의 저장 순서를 보장하지 않습니다.
  • 빠른 접근 속도: 해시 테이블을 사용하여 요소를 빠르게 검색, 추가, 삭제할 수 있습니다.
import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        
        // 요소 추가
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Apple"); // 중복된 요소는 추가되지 않음

        // 요소 출력
        for (String item : set) {
            System.out.println(item);
        }
        
        // 요소 검색
        System.out.println("Contains 'Apple': " + set.contains("Apple")); // true
        System.out.println("Contains 'Orange': " + set.contains("Orange")); // false
    }
}

 

 

HashMap

HashMap은 맵(Map) 인터페이스를 구현한 클래스로, 키-값 쌍(key-value pair)을 저장하고 관리하는 데 사용됩니다. 각 키는 유일해야 하며, 키를 통해 값을 빠르게 검색할 수 있습니다.

주요 특징

  • 키-값 쌍 저장: 각 키는 유일하며, 이를 통해 값을 저장하고 검색합니다. 각 키와 값은 해시 테이블에 저장됩니다.
  • 빠른 접근 속도: 해시 테이블을 사용하여 키를 빠르게 검색, 추가, 삭제할 수 있습니다.
  • 순서 없음: 키-값 쌍의 저장 순서를 보장하지 않습니다.
import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        
        // 키-값 쌍 추가
        map.put("Apple", 1);
        map.put("Banana", 2);
        map.put("Cherry", 3);
        map.put("Apple", 4); // 키가 동일할 경우 값이 덮어쓰여짐

        // 키-값 쌍 출력
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
        
        // 값 검색
        System.out.println("Value for key 'Apple': " + map.get("Apple")); // 4
        System.out.println("Value for key 'Orange': " + map.get("Orange")); // null
    }
}

 

비교

  • 데이터 구조: HashSet은 집합(Set) 인터페이스를 구현하고, HashMap은 맵(Map) 인터페이스를 구현합니다.
  • 중복 허용 여부: HashSet은 중복 요소를 허용하지 않지만, HashMap은 중복 키를 허용하지 않습니다(키가 동일하면 값이 덮어쓰여짐). HashMap은 키는 중복을 허용하지 않지만, 값은 중복을 허용합니다.
  • 저장 형태HashSet은 단일 값을 저장하고, HashMap은 키-값 쌍을 저장합니다.
  • 내부 구현: HashSet은 내부적으로 HashMap을 사용하여 요소를 저장합니다. 각 요소는 HashMap의 키로 저장되고, 모든 값은 HashMap의 특정 상수(PRESENT)로 저장됩니다.

내부 구현 차이

HashSet의 내부 구현은 다음과 같이 HashMap을 사용합니다:

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {
    private transient HashMap<E, Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    public HashSet() {
        map = new HashMap<>();
    }

    public boolean add(E e) {
        return map.put(e, PRESENT) == null;
    }

    // Other methods...
}

위 코드는 HashSet이 내부적으로 HashMap을 사용하여 요소를 저장하는 방식을 보여줍니다. 각 요소는 HashMap의 키로 저장되며, 값으로는 PRESENT라는 상수 객체가 사용됩니다.

'Java Study' 카테고리의 다른 글

LinkedList  (0) 2024.07.18
Collection 인터페이스  (0) 2024.07.18
Type Erasure(타입 소거)  (0) 2024.07.18
@ 어노테이션 (Annotation)  (0) 2024.07.18
와일드카드의 종류 (insert 되는지 안되는지 is-a관계)  (1) 2024.07.17