Java의 HashMap, HashSet 및 Hashtable
Java의 Collection
인터페이스는 다양한 데이터 구조와 알고리즘을 구현하기 위한 다양한 인터페이스와 클래스를 제공합니다.
이 튜토리얼에서는 Java의 HashMap
, HashSet
, Hashtable
에 대해 설명합니다.
먼저 일반적으로 해시 테이블이 무엇인지 이해합시다.
해시 테이블을 사용하여 키-값 쌍 패턴으로 요소를 저장할 수 있습니다. 즉, 모든 키에는 연관된 값이 있습니다. 키는 값을 인덱싱하는 데 사용되는 고유한 값입니다. 값은 해당 키와 관련된 데이터입니다.
해시 테이블 데이터 구조는 키를 사용하여 새 인덱스를 처리하는 해싱 개념을 따릅니다. 그러면 해당 키에 해당하는 요소가 인덱스에 저장됩니다. 이것이 해싱의 개념입니다.
h(x)
를 해시 함수라고 하고 k
를 키라고 하면 h(k)
는 k
와 연결된 요소를 저장하기 위한 새 인덱스를 제공합니다.
자바 HashMap
HashMap
은 해시 테이블 데이터 구조를 제공하는 Java 컬렉션 프레임워크의 클래스입니다. 요소를 키-값 쌍으로 저장합니다. 여기서 키는 맵의 특정 값과 쌍을 이루는 고유 식별자입니다. HashMap
클래스는 Collections 인터페이스를 추가로 확장하는 Map 인터페이스를 구현합니다.
HashMap
은 비동기화되어 스레드로부터 안전하지 않습니다. 여러 스레드를 사용하여 액세스하고 동시에 수정할 수 있습니다. 외부에서 스레드로부터 안전하게 만들 수 있습니다.
HashMap
의 또 다른 특징은 null 키 또는 값 쌍을 보유할 수 있다는 것입니다.
예를 들어,
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> h = new HashMap<>();
h.put("One", 1);
h.put("Two", 2);
h.put("Three", 3);
System.out.println(h);
}
}
출력:
HashMap: {One=1, Two=2, Three=3}
자바 Hashtable
Java의 Hashtable
클래스는 해시 테이블 데이터 구조를 구현합니다. HashMap
과 유사하게 요소를 키-값 쌍으로 저장합니다. 그러나 동기화된다는 점에서 HashMap
과 다릅니다. 해시 테이블에 키-값 쌍을 저장합니다. Map 인터페이스를 구현합니다.
먼저 Hashtable
에서 개체를 키로 지정하고 해당 값을 쌍으로 지정합니다. 그런 다음 키가 해시되고 결과 해시 코드를 사용하여 테이블 내에 저장된 값에 대한 인덱스로 사용됩니다.
이로 인해 Hashtable
과 관련된 문제는 각 메서드 호출을 동기화하는 것이 상대적으로 중요하지 않다는 것입니다. 매번 필요하지 않습니다. 따라서 이 문제를 극복하기 위해 컬렉션 프레임워크의 작성자는 동기화되지 않은 HashMap
(요소를 매핑함을 명확히 함)이라는 새 클래스를 고안했습니다.
메소드 레벨 동기화를 사용하고 싶지 않다면 Hashtable
을 건너뛰고 맵을 동기화된 맵으로 바꾸는 Collections.synchronizedMap()
을 사용할 수 있습니다. 또는 설명서에 따르면 Hashtable
과 동일한 기능을 제공하지만 더 나은 성능과 몇 가지 추가 기능을 제공하는 ConcurrentHashMap
을 사용할 수도 있습니다.
예를 들어,
import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[]) {
Hashtable<Integer, String> h = new Hashtable<>();
h.put(1, "one");
h.put(2, "two");
h.put(3, "three");
System.out.println(h);
}
}
출력:
{3=three, 2=two, 1=one}
자바 HashSet
HashSet
은 해시 테이블 데이터 구조(예: HashMap
)의 구현을 제공하는 Java 컬렉션 프레임워크의 클래스입니다. 여전히 컬렉션 인터페이스를 확장하는 Set
인터페이스(HashMap
과 달리)를 구현합니다. 이것은 일반적으로 키를 값 쌍에 매핑할 필요가 없을 때 사용됩니다.
HashSet
은 HashSet
이 중복 값을 보유할 수 없다는 점에서 Hashtable
과 다릅니다. 키-값 쌍은 고유합니다. 기능면에서 HashSet
은 HashMap
과 공통점이 없지만 내부적으로 HashMap
을 사용하여 Set 인터페이스를 구현합니다.
예를 들어,
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<Integer> h = new HashSet<>();
h.add(5);
h.add(10);
h.add(15);
System.out.println(h);
}
}
출력:
[5, 10, 15]
관련 문장 - Java HashMap
- Java의 Hashmap 충돌
- Java에서 HashMap 정렬
- Java에서 키로 HashMap 정렬
- Java에서 Hashmap과 Map의 차이점
- Java에서 해시 테이블과 해시 맵의 차이점