
- key, value
- 순서X (인덱스 X), (element의) 중복0 (key의 중복X)
- 원하는 값으로 키 지정 가능, 키와 값에 null을 허용
- Collection 인터페이스와 다른 Map 인터페이스
Hash
- HashSet은 element(저장할 데이터)로 해시코드 생성
HashMap(element, dump) => element 중복 불가
- HashMap은 key로 해시코드 생성 (key, value)
HashMap(key, element) => key 중복 불가
- 같은 value 라도 key 다르게 줄 수 있으므로 충돌 확률이 HashSet 보다 적다
(HashSet은 같은 value면 충돌)
- 해시코드 -> home address (hash table)
HashMap
- Collection 인터페이스 아닌 Map 인터페이스를 구현함 (제너릭 파라미터가 두개 이기 때문) => 메서드 다름

public class HashMapExample {
public static void main(String[] args) {
Map<Integer, String> hashMap = new HashMap<>();
for (int i = 1; i <= 10 ; i++) {
if (!hashMap.containsKey(i)) {
hashMap.put(i, Character.toString((i - 1) + 'a'));
} else {
}
}
System.out.println("hashMap = " + hashMap);
System.out.println("hashMap.size() = " + hashMap.size());
System.out.println();
hashMap.put(null, "something");
System.out.println("hashMap = " + hashMap);
System.out.println("hashMap.size() = " + hashMap.size());
System.out.println();
System.out.println("hashMap.get(null) = " + hashMap.get(null));
System.out.println();
System.out.println("hashMap.get(100) = " + hashMap.get(100));
for (int key = 1; key <= 10; key++) {
if (hashMap.containsKey(key)) {
System.out.println("hashMap.get(key) = " + hashMap.get(key));
}
}
System.out.println();
for (int key = 1; key <= 10; key++) {
if (hashMap.containsKey(key)) {
hashMap.put(key, hashMap.get(key).repeat(3));
}
}
System.out.println("hashMap = " + hashMap);
System.out.println("hashMap.size() = " + hashMap.size());
System.out.println();
hashMap.replace(-1, "a");
System.out.println("hashMap = " + hashMap);
hashMap.replace(1, "abcde!@@");
System.out.println("hashMap = " + hashMap);
hashMap.replace(1, "abcde!@@", "abcde");
System.out.println("hashMap = " + hashMap);
System.out.println();
Map map = Map.of(3, "$$", 4, "!!", 100, "@@");
hashMap.putAll(map);
System.out.println("hashMap = " + hashMap);
System.out.println("hashMap.size() = " + hashMap.size());
System.out.println();
Iterator<Integer> iterator = hashMap.keySet().iterator();
while (iterator.hasNext()) {
Integer i = iterator.next();
System.out.println("key => " + i + ", value => " + hashMap.get(i));
}
System.out.println();
for (Map.Entry<Integer, String> entry: hashMap.entrySet()) {
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println( "key => " + key + ", value => " + value);
}
System.out.println("hashMap.keySet() = " + hashMap.keySet());
System.out.println("hashMap.values() = " + hashMap.values());
System.out.println("hashMap = " + hashMap);
System.out.println("hashMap.containsKey(100) = " + hashMap.containsKey(100));
System.out.println("hashMap.containsValue(\"aaa\") = " + hashMap.containsValue("aaa"));
System.out.println();
hashMap.remove(1);
hashMap.remove(2);
hashMap.remove(null);
hashMap.remove(1, "aaa");
System.out.println("hashMap = " + hashMap);
System.out.println("hashMap.size() = " + hashMap.size());
System.out.println();
hashMap.clear();
System.out.println("hashMap = " + hashMap);
System.out.println("hashMap.size() = " + hashMap.size());
System.out.println();
System.out.println("hashMap.isEmpty() = " + hashMap.isEmpty());
System.out.println();
Map<Integer, String> hashMap1 = new HashMap<>();
for (int i = 1; i <= 10 ; i++) {
hashMap1.put(i, Character.toString((i-1) + 'a'));
}
System.out.println("hashMap1 = " + hashMap1);
Integer[] keys = hashMap1.keySet().toArray(new Integer[hashMap1.size()]);
String[] values = hashMap1.values().toArray(new String[hashMap1.size()]);
Object[] objects = hashMap1.entrySet().toArray();
Map.Entry<Integer, String>[] entries = (Map.Entry<Integer, String>[]) hashMap1.entrySet().toArray(new Map.Entry[hashMap1.size()]);
System.out.println("keys = " + Arrays.toString(keys));
System.out.println("values = " + Arrays.toString(values));
System.out.println("objects = " + Arrays.toString(objects));
System.out.println("entries = " + Arrays.toString(entries));
System.out.println();
Map<Integer, String> hashMap2 = new HashMap<>(Map.ofEntries(entries));
System.out.println("hashMap2 = " + hashMap2);
}
}
HashTable
HashMap과 HashTable
- JDK1.0+
- 메서드 동일
- synchronized -> 속도 느림 (레거시)
- 대신 synchronizedMap, concurrentHashMap 사용
synchronizedHashMap = Collections.synchronizedMap(new HashMap<String, String>());
concurrentHashMap = new ConcurrentHashMap<String, String>();
LinkedHashMap
- HashMap + LinkedList(들어간 순서) => 삽입 순서 유지
- 메서드 동일

TreeMap
- 크기의 순서 유지
- Key, Value 중 무엇 으로 비교?? -> Key
- vs. TreeSet : element로 비교. TreeSet도 내부적으로 Map 이용 (element가 key 됨)
private final Comparator<? super K> comparator; // TreeMap.java
- 특정 key 이상만 comparator 생성 가능
- Pen 을 Item 의 productNo 으로 sort 가능
- 레드-블랙 트리 (self-balancing binary search tree)

public class TreeMapExample {
public static void main(String[] args) {
Map<Integer, String> treeMap = new TreeMap<>();
for (int i = 10; i >= 1 ; i--) {
if (!treeMap.containsKey(i)) {
treeMap.put(i, Character.toString((i - 1) + 'a'));
}
}
System.out.println("treeMap = " + treeMap);
System.out.println("treeMap.size() = " + treeMap.size());
System.out.println();
...
Map<Key, Pen> penMap = new TreeMap<>();
penMap.put(new Key("0001", "QS8879921031"), new Pen("0001", "파카", "red"));
penMap.put(new Key("0002", "NS1230910000"), new Pen("0002", "빅", "black"));
penMap.put(new Key("0003", "KS0000123123"), new Pen("0003", "파카", "blue"));
penMap.put(new Key("0004", "SS1123124123"), new Pen("0004", "제브라", "red"));
System.out.println("penMap = " + penMap);
System.out.println("penMap.size() = " + penMap.size());
System.out.println();
Collection<String> collection = treeMap.values();
System.out.println(collection);
Iterator<Integer> iterator1 = treeMap.keySet().iterator();
while (iterator1.hasNext()) {
Integer i = iterator1.next();
System.out.println("key => " + i + ", value => " + treeMap.get(i));
}
System.out.println();
...
}
Map
public class MapExample {
public static void main(String[] args) {
Map<Integer, String> streamMap = Stream.of(new Object[][] {
{ 1, "Java" },
{ 2, "JSP" },
{ 3, "Servlet" },
{ 4, "Spring" },
}).collect(Collectors.toMap(data -> (Integer) data[0], data -> (String) data[1]));
System.out.println("streamMap = " + streamMap);
Map<String, String> streamMap2 = Stream.of(new String[][] {
{ "a", "Java" },
{ "b", "JSP" },
{ "c", "Servlet" },
{ "d", "Spring" },
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));
System.out.println("streamMap2 = " + streamMap2);
System.out.println();
Map<Integer, String> map = Map.of(1, "a", 2, "b", 3, "c", 4, "d", 5, "e");
...
}