learn/data structure

해쉬맵 (HashMap)과 해쉬테이블 (HashTable)

사겅이 2023. 9. 24. 14:07

출처 : https://www.scaler.com/topics/difference-between-hashmap-and-hashtable/

 

해쉬맵(HashMap)

Java에서 제공하는 데이터 구조 중 하나로, 키(Key)와 값(Value)의 쌍을 저장하는 자료구조로 빠르게 데이터를 검색하고 저장할 수 있음

  • 키와 값의 쌍: 각 요소를 키와 값의 쌍으로 저장하며 쌍은 서로 연결되어 있으며, 특정 키를 통해 해당 값에 빠르게 접근할 수 있음
  • 중복 키 불가: 키는 중복되지 않고 동일한 키를 여러 번 추가할 수 없음
  • 순서 보장하지 않음: 요소들의 순서를 보장하지 않고 데이터가 저장된 순서대로 접근할 수 없음
  • 검색 및 삽입 시간 복잡도: HashMap은 해시 테이블을 사용하기 때문에 키를 기반으로 데이터를 검색하고 삽입하는 데 평균적으로 O(1)의 시간 복잡도를 가지지만 해시 충돌(Hash Collision)이 발생할 경우 시간 복잡도는 O(n)이 될 수 있음

출처 : https://coding-factory.tistory.com/556

import java.util.HashMap;

public class HashMapTest {
    public static void main(String[] args) {
        // HashMap 생성
        HashMap<String, Integer> studentScores = new HashMap<>();

        // 값 추가
        studentScores.put("Alice", 95);
        studentScores.put("Bob", 88);
        studentScores.put("Charlie", 92);

        // 값 조회
        int aliceScore = studentScores.get("Alice");
        System.out.println("Alice's Score: " + aliceScore);

        // 값 삭제
        studentScores.remove("Bob");

        // 키가 존재하는지 확인
        boolean isCharliePresent = studentScores.containsKey("Charlie");
        System.out.println("Is Charlie present? " + isCharliePresent);

        // HashMap 크기 확인
        int size = studentScores.size();
        System.out.println("HashMap Size: " + size);

        // 모든 항목 출력
        for (String name : studentScores.keySet()) {
            int score = studentScores.get(name);
            System.out.println(name + "'s Score: " + score);
        }
    }
}

 

해쉬테이블(HashTable)

해시 함수를 사용하여 키를 해시 코드로 변환하고 이 코드를 배열의 인덱스로 사용하여 데이터에 접근

 

  • 해시 함수 사용: 해시 테이블은 해시 함수를 사용하여 각 키를 고유한 해시 코드(인덱스)로 변환하고 이 해시 코드를 사용하여 데이터를 저장하고 검색
  • 빠른 검색 속도: 해시 테이블은 해시 코드를 이용해 데이터를 검색하기 때문에 평균적으로 O(1)의 시간 복잡도로 빠르게 데이터에 접근할 수 있음
  • 중복 키 처리: 해시 테이블 내에서 중복된 키는 허용되지 않으며, 각 키는 유일해야 하고 중복 키가 발생하면 기존 값에 덮어씌워짐
  • 크기 조절: 해시 테이블은 동적으로 크기를 조절할 수 있어야 하고 데이터의 양이 증가하면 해시 테이블의 크기를 확장하여 충돌을 최소화
  • 해시 충돌 처리: 서로 다른 키가 같은 해시 코드로 매핑될 때 충돌이 발생하며 이를 해결하기 위해 충돌 처리 알고리즘을 사용
  • 동기화(Synchronization) 지원: 멀티스레드 환경에서 안전하게 사용

출처 :&nbsp;https://laboputer.github.io/ps/2017/10/03/hashtable/

public class HashTableTest {
    public static void main(String[] args) {
        // HashTable 생성
        Hashtable<String, Integer> studentScores = new Hashtable<>();

        // 값 추가
        studentScores.put("Alice", 95);
        studentScores.put("Bob", 88);
        studentScores.put("Charlie", 92);

        // 값 조회
        int aliceScore = studentScores.get("Alice");
        System.out.println("Alice's Score: " + aliceScore);

        // 값 삭제
        studentScores.remove("Bob");

        // 키가 존재하는지 확인
        boolean isCharliePresent = studentScores.containsKey("Charlie");
        System.out.println("Is Charlie present? " + isCharliePresent);

        // HashTable 크기 확인
        int size = studentScores.size();
        System.out.println("HashTable Size: " + size);

        // 모든 항목 출력
        for (String name : studentScores.keySet()) {
            int score = studentScores.get(name);
            System.out.println(name + "'s Score: " + score);
        }
    }
}

 

HashMap(해시맵)과 HashTable(해시테이블) 차이

  • 동기화(Synchronization): HashTable은 스레드에 안전(thread-safe)한 자료구조로, 여러 스레드가 동시에 접근할 때 안전하게 사용할 수 있으나 HashMap은 동기화되어 있지 않으며, 여러 스레드 간에 동시에 접근할 때 문제가 발생할 수 있음
  • Null 허용 여부: HashMap은 키와 값에 null을 허용하여 null 키와 null 값 모두 저장할 수 있으나 HashTable은 키나 값 중 하나라도 null인 경우 예외를 발생시킵니다.
  • 성능: 일반적으로 HashMap의 성능이 HashTable보다 우수하며 이는 HashMap이 동기화 오버헤드가 없기 때문입니다.
    반복 순서: HashMap은 순서를 보장하지 않으며 요소의 순서는 예측할 수 없으나 HashTable은 요소를 저장한 순서대로 순회
  • Legacy 클래스: HashTable은 자바의 초기 버전부터 존재하던 레거시 클래스이며 HashMap은 보다 최신 버전의 자바에서 도입되어 더 많은 기능과 성능 개선을 제공함

 

'learn > data structure' 카테고리의 다른 글

파일 (File)  (0) 2023.09.24
그래프 (Graph)  (0) 2023.09.24
트리 (Tree)  (0) 2023.09.24
데크 (Deque)  (0) 2023.09.24
큐 (Queue)  (0) 2023.09.24