주제 정리

[JAVA] HashTable, HashMap

박상순 2021. 8. 12. 00:29

HashTable와 HashMap

공통점

  • Map을 상속 받아 구현한 클래스로 Key, Value를 한 쌍으로 가지는 자료구조이다.
  • Key 값은 식별을 위한 값이고 Value는 실제로 사용할 값인 데이터를 넣는 형식이다.
  • 리스트 자료구조보다 탐색에 있어서는 더 놓은 효율을 기대할 수 있다.
  • Method
    • 값을 저장 : put(key, value);
    • 값을 불러오기 : get(key);
    • 값을 변경하기 : replace(key, value);
    • 삭제하기 : remove(key);
    • 크기 확인하기(저장된 데이터 갯수) : size();
    • 비어 있는지 확인하기 : isEmpty();

차이점

  • HashTable은 동기화를 지원하며 HashMap은 동기화를 지원하지 않아 멀티스레드 상황에서는 HashTable을 사용하는 것이 데이터를 안전하게 보호 할 수 있다.
    • 단일 스레드 상황에서는 HashMap의 속도가 HashTable에 비해서 빠르다.
  • HashTable은 key 값에 Null 값을 허용하지 않지만 HashMap은 key 값에 Null을 허용한다.

 

속도 차이 반복 횟수 1억번

단일 스레드의 데이터 추가와 삭제를 4번씩 반복하는 형태로 속도 테스트를 진행하였다.

public class SpeedTest {
    public static void main(String[] args) {
        Hashtable<Integer, String> ht = new Hashtable<Integer, String>();
        long beforeTime = System.currentTimeMillis();
        for(int i = 0; i < 100000000; i++) {
            ht.put(0, "고양이");
            ht.put(1, "호랑이");
            ht.put(2, "강아지");
            ht.put(3, "다람쥐");
            ht.remove(0);
            ht.remove(1);
            ht.remove(2);
            ht.remove(3);
        }
        long afterTime = System.currentTimeMillis();
        System.out.println("HashTable : " + (afterTime - beforeTime) / 1000 + " 초");
        
        HashMap<Integer, String> hm = new HashMap<Integer, String>();
        beforeTime = System.currentTimeMillis();
        for(int i = 0; i < 100000000; i++) {
            hm.put(0, "고양이");
            hm.put(1, "호랑이");
            hm.put(2, "강아지");
            hm.put(3, "다람쥐");
            hm.remove(0);
            hm.remove(1);
            hm.remove(2);
            hm.remove(3);
        }
        afterTime = System.currentTimeMillis();
        System.out.println("HashMap : " + (afterTime - beforeTime) / 1000 + " 초");
    }
}
# 결과 값 #
HashTable : 5 초 / 5893ms
HashMap : 4 초 / 4818ms

1억번의 반복에서 1초의 차이가 발생한다. 단일 스레드 상황이 확실하게 보장된다면 HashMap을 사용하는 것이 속도면에서 이점이 있다.

 

하지만 실제 앱에서는 멀티스레드로 대용량 정보들을 처리하는 경우가 더 많기 때문에 동기화를 통한 데이터의 안정을 보장할 수 있는 HashTable로 사용하는 습관을 들이는 것이 더 좋다고 생각된다.

728x90

'주제 정리' 카테고리의 다른 글

[아키텍처]마이크로 서비스  (0) 2021.08.19
[JAVA] HashSet  (0) 2021.08.13
Object 객체 탐구  (0) 2021.08.07
디자인 패턴 23가지  (0) 2021.08.07
[JAVA] StringBuilder와 StringBuffer  (0) 2021.08.07