[Java] 해시테이블 (Hashtable)

2022. 8. 11. 01:32·Language/Java
728x90

해시테이블 (Hashtable)

해시테이블은 해시맵(HashMap)과 함께 Map을 구현한 키와 값 쌍을 데이터로 저장한 컬렉션(Collection)이다. 여기서 키는 유일해야만 한다. 해시테이블은 이 키를 가지고 키에 해당하는 값은 찾는다.

Hashtable과 HashMap의 차이

Hashtable과 HashMap의 차이점은 Thread-Safe인지 아닌지가 그 차이점인데 Hashtable은 동기화가 걸려있어서 Thread-Safe하다고 할 수 있으며, HashMap은 동기화가 없어 unsafe하다고 할 수 있다. 그래서 안전성을 추구한다면 Hashtable을 쓰면 되고, 데이터의 빠른 처리를 위해서라면 HashMap을 사용하면 된다.

 

인터페이스인 Map을 구현한 만큼 HashMap과 사용법이 거의 비슷하다. put으로 키와 값을 저장하고 get으로 키에 해당하는 값을 읽어온다. Hashtable에서 table은 소문자라는 점을 유의한다.

put, get 메소드 사용법

import java.util.Hashtable;
import java.util.HashMap;
import java.util.Map;

public class Main {

	public static void main(String[] args) {
    
		Map<String, Integer> ht = new Hashtable();
		ht.put("key1", 100);
		ht.put("key2", 200);
		ht.put("key2", 300); // 같은 키가 들어갈 경우
        
		System.out.println(ht);
		System.out.println(ht.get("key1"));
		System.out.println(ht.get("key2"));
		System.out.println(ht.get("key3")); // 키가 없을 경우
	}
    
}
// 출력 결과
{key2=300, key1=100}
100
300
null

만약 동일한 키를 가지고 데이터를 집어 넣게 된다면 가장 마지막의 키와 값 요소로  저장이 된다. 그리고 키가 존재하지 않으면 null을 반환한다.

갖고 있는 모든 키를 순회(keySet)

만약 Hashtable이 갖고 있는 모든 키를 알고 싶다면 keySet()메소드로 모든 키를 가져올 수 있다. 이때 반환하는 자료형은 Set이다. 아래의 코드같이 키와 값을 추출할 수 있다.

public static void main(String[] args) {
	Map<String, Integer> ht = new Hashtable();
	ht.put("foo", 100);
	ht.put("bar", 200);
	for(String key:ht.keySet()) {
		System.out.println("{" + key + "," + ht.get(key) + "}");
	}
}
// 실행 결과
{bar, 200}
{foo, 100}

Hashtable에 Hashtable을 추가(putAll)

두 Hashtable을 합치고 싶다면 putAll()메소드를 사용하면 된다. 다만 putAll()의 인자로 전달한 Hashtable의 키, 값의 변화가 있다해도 합쳐진 Hashtable에는 영향을 받지 않는다.

public static void main(String[] args) {
	Map<String, Integer> ht1 = new Hashtable();
	ht1.put("key1", 1111);
	ht1.put("key2", 2222);
    
	Map<String, Integer> ht2 = new Hashtable();
	ht2.put("key3", 3333);
	ht2.put("key4", 4444);
    
	ht2.putAll(ht1);
	System.out.println(ht2);
    
	ht1.put("key5", 5555); // ht1에 데이터 추가
	System.out.println(ht2);
}
// 실행 결과
{key4=4444, key3=3333, key2=2222, key1=1111}
{key4=4444, key3=3333, key2=2222, key1=1111}

ForEach() 메소드로 키와 값 순회하기

Hashtable에는 ForEach메소드가 존재하는데 이것을 가지고 키와 값으로 동작을 정의할 수 있다.

람다식의 기초를 알아야하는데, 사용법만 알아도 상관은 없다.

public static void main(String[] args) {
	Map<String, Integer> ht = new Hashtable();
	ht.put("june", 6);
	ht.put("july", 7);
	ht.put("august", 8);
	ht.put("september", 9);
	ht.put("october", 10);
	ht.put("november", 11);
	ht.put("december", 12);
	ht.forEach((key, value) ->
	{
		System.out.println("{" + key + "," + value + "}");
	});
}
// 실행 결과
{august, 8}
{december, 12}
{november, 11}
{july, 7}
{september, 9}
{october, 10}
{october, 10}

Hashtable의 Thread-Safe

쓰레드에 대해서 동시접근에 안전하려면  Hashtable을 쓰는것이 좋고, 단일 쓰레드에서 사용한다면 HashMap을 쓰는 것이 좋다.

'Language > Java' 카테고리의 다른 글

[Java] extends, implements의 차이  (0) 2022.08.11
[Java] 다차원 배열 (multi-dimensional array)  (0) 2022.08.11
[Java] 해시맵 (HashMap)  (0) 2022.08.10
[Java] 실습 class AppleOrange  (0) 2022.08.10
[Java] compareTo 메소드  (0) 2022.08.09
'Language/Java' 카테고리의 다른 글
  • [Java] extends, implements의 차이
  • [Java] 다차원 배열 (multi-dimensional array)
  • [Java] 해시맵 (HashMap)
  • [Java] 실습 class AppleOrange
arajo
arajo
  • arajo
    아라 메모장
    arajo
  • 전체
    오늘
    어제
    • 분류 전체보기 (509)
      • Language (298)
        • HTML (55)
        • CSS (11)
        • JavaScript (70)
        • TypeScript (8)
        • Python (33)
        • Java (119)
        • C (0)
        • C# (2)
      • Programming (92)
        • Programming (14)
        • Web (51)
        • Apache (1)
        • MySQL (23)
        • AWS (3)
      • Framework | Library (26)
        • Framework | Library (3)
        • Vue.js (2)
        • React.js (5)
        • React Native (4)
        • Node.js (1)
        • Ajax (1)
        • Bootstrap (8)
        • Spring (1)
        • Flutter (1)
      • etc (2)
      • 휴식 (19)
        • 책 (13)
        • 일기 (5)
        • 게임 일기 (1)
      • A (71)
        • 공부 (18)
        • 기타 (6)
        • 일 (47)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    object
    자바스크립트
    TypeScript
    MySQL
    변수
    CSS
    array
    HTML
    타입스크립트
    next.js
    제어문
    Python
    event
    Java
    react
    JavaScript
    객체
    파이썬
    리액트
    web
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
arajo
[Java] 해시테이블 (Hashtable)
상단으로

티스토리툴바