티스토리 뷰

Java

HashMap과 HashTable의 차이

DEV_GOLF 2022. 2. 16. 18:49
반응형

HashTable은 컬렉션 프레임워크가 만들어지기 전에 존재하던 것이다. 하지만 호환을 위해 설계를 변경해서 남겨 두었다. 사용한다면 말리진 않겠지만 추천하진 않는다.(HashMap or ConcurrentHashMap) 사용 권장

 

HashTable은 이름 그대로 해시 테이블을 구현한 클래스로 거의 HashMap과 사용법이 동일하다.

public class HashTableEx {

    public static void main(String[] args) {
        Hashtable<String, String> hashtable = new Hashtable<>();

        hashtable.put("1", "kim1");
        hashtable.put("2", "kim2");
        hashtable.put("2", "kim3");
        hashtable.put("3", "kim4");

        for (String key : hashtable.keySet()) {
            System.out.println(hashtable.get(key));
        }
    }
}

거의 사용법이 동일하지만 분명 둘은 차이점을 갖고 있다.

 

1. Thread-safe

HashMap 같은 경우에는 syncronized 키워드가 붙어있지 않다. 반면에 HashTable은 sycronized가 붙어 동기화를 진행해주고 있다. 그렇기에 멀티 쓰레드 환경에서 메소드 호출하기 전 쓰레드간 동기화 락을 걸고 멀티 쓰레드 환경에서도 데이터 무결성을 보장한다.

HashTable put 메서드
HashMap put 메서드

동기화를 지원하는 HashTable은 멀티스레드 환경이 아니라면 쓰레드간 락을 거는 건 매우 느린 동작 이기 때문에 성능이 떨어진다는 단점이 존재한다. 하지만 멀티스레드 환경이라면 동기화를 해줘야 하기 때문에 HashMap은 사용하기 위험하다. (하지만 그렇다고 HashTable은 사용할 필요가 없다.)

2. Null 값 허용

HashTable은 key에 null을 허용하지 않는다. 그치만 HashMap은 key에 null을 허용한다. 내부적으로 HashTable은 바로 null이들어가면 NullPointer를 던지지만 HashMap은 그렇지 않다. hashMap은 내부적으로 null이 들어오면 0으로 해싱을 하여 저장한다. 그리고 이는 null에 대한 특수한 상황 처리에 대한 부담을 덜어주기 때문이다. 또한 과도한 오버헤드라고 생각할 수 있어 이렇게 설계 하는 경우도 존재한다고 한다.

 

자세한 내용은 이것을 참조하기 바란다 : https://www.quora.com/Why-is-null-accepted-as-a-key-in-Java-HashMap

 

Why is null accepted as a key in Java HashMap?

Answer (1 of 3): I assume that this implementation allows null as key to possible implement a default value in a map. Also, a null reference is easy to identify, objects required to properly implement equals and hashCode contract. [code]greetings.get(“es

www.quora.com

 

또한 null 객체 패턴이라는 것도 존재하니 살펴보기 바란다.

https://johngrib.github.io/wiki/pattern/null-object/

 

널 오브젝트 패턴 (Null Object Pattern)

인터페이스는 구현하지만 아무 일도 하지 않는 객체

johngrib.github.io

 

3. Enumeration 여부

HashTable은 not fail-fast Enumeration을 제공하지만, HashMap은 Enumeration을 제공하지 않는다.

 

또한 HashMap은 보조 해시를 사용하기 때문에 보조 해시 함수를 사용하지 않는 HashTable에 비하여 해시 충돌이 덜 발생하여 성능상 이점이 있다.

 

* 보조 해시 함수란 hash를 재정의 하여 새로운 hashcode를 생성해내는 함수를 말한다. 그렇기에 null에 대한 유연한 처리나 충돌이 덜 일어날 수 있는 것이다. 

 

아무튼 이어서 not fail-fast Enumeration을 지원하기 때문에

public class Test1 {
    public static void main(String[] args) {
        Hashtable<Integer, Integer> hm = new Hashtable<>();
        hm.put(1, 1);
        hm.put(2, 1);

        Enumeration<Integer> keys = hm.keys();
        hm.remove(1);

        while (keys.hasMoreElements()) {
            System.out.println(keys.nextElement());
        }
    }
}

정상적으로 위 코드가 동작하여 버그를 발견하지 못할 수 있는 위험이 있지만

public class Test1 {
    public static void main(String[] args) {
        Hashtable<Integer, Integer> hm = new Hashtable<>();
        hm.put(1, 1);
        hm.put(2, 1);

        Iterator<Integer> iterator = hm.keySet().iterator();
        hm.remove(1);

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

HashMap에 경우엔 예외를 던져 버그를 사전에 방지할 수 있다. 이 때 HashMap은 ConcurrentModificationException을 발생시킨다.  

정리

되도록이면 HashTable은 호환을 위해 남겨뒀을 뿐 많은 위험이 존재하고 과한 null에 대한 처리 해시 충돌 등에 관하여 효과적으로 처리하고 있지 않다. 그렇기 때문에 HashMap을 추천한다. 다만 멀티 쓰레드 환경에서는 쓰레드 락을 걸어 안전성을 보장해야 하기 때문에 syncronized 키워드가 붙은 ConcurrentHashMap을 쓰는 것을 추천한다. 또한 LinkedHashMap도 존재하기에 순서를 보장받을 경우에도 다양하게 사용할 수 있다. 

 

Refer.

https://tecoble.techcourse.co.kr/post/2021-11-26-hashmap-hashtable-concurrenthashmap/

 

HashMap vs HashTable vs ConcurrentHashMap

이미지 출처: Top 35 Data Structure & Algorithms Interview Questions and Answers in 2021 각 자료구조는 필요에 따라 선택되고 활용된다. 인터페이스의 구현체로는 , , 등이 있다. Map 인터페이스를 구현하면, 형태

tecoble.techcourse.co.kr

https://devlog-wjdrbs96.tistory.com/253

 

[Java] HashMap vs Hashtable 차이는 무엇일까?

Hashtable 이란? Hashtable 클래스는 컬렉션 프레임웍이 만들어지기 이전부터 존재하던 것이기 때문에 컬렉션 프레임워의 명명법을 따르지 않습니다. Vector 나 Hashtable 과 같은 기존의 컬렉션 클래스들

devlog-wjdrbs96.tistory.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함