HashMap이란 객체를 Map에 넣는 것이다.
key-value쌍 하나만 넣는 것이 가장 기본적이며, 배열의 한 요소를 bucket이라고 한다.
(자바에서는, 키와 값의 타입은 클래스 및 인터페이스 타입만 가능하다. 기본 타입은 사용 할수 없음)
또한, HashMap에서의 key는 unique해야합니다. (key는 중복 불가, value는 중복 가능)
key-value쌍이 들어가는 위치는, key의 Hash (HashCode) 이며, 이로 인해 데이터를 탐색하는데 O(1)로 가능하다.
이때, 동일하지 않은 두 객체가 같은 위치에 들어가려고 하는 경우를 Collision 이라고 하는데, Collision은 Map의 성능에 큰 영향을 미치므로, 어떤 Hash 함수를 사용하는 가에 따라서 더 나은 Map이 될 수 있다.
이 때, Map에 더 들어갈 공간이 없을 때 다음 두 가지 방법을 선택한다.
1.리스트를 넣는다.
2.size를 늘린다.
size를 늘리는 방식에 대해서 살펴보겠다.
Load factor는 Map의 capacity를 몇 %로 할지를 정하는 값이다. 가령, Map의 사이즈가 4이고, loadfactor가 0.75라고 해보자.
Map<String, String> map = new HashMap<>(4, 0.75f);
주의)반복문을 돌릴 때, Iterator 바로 못 쓰고, keySet() 하고 써야함.
그러면, Map의 공간은 다음과 같이 동작한다.
파생질문. HashMap의 HashCode(), equals()에 대해서 설명하세요.
1.hashCode() : 객체 고유의 해시코드를 반환한다. - 두 객체가 같은 같은 객체인지 확인할 때 사용한다.
2.equals() : == 와 같은 결과를 반환한다. - 두 객체의 내용이 같은지 확인할 때 사용한다.
참고) instanceof 사용
a instanceof b
- a는 .b로 변환이 가능한지
-반환 값: true or false
파생질문. HashTable과 HashMap에 대해서 설명하세요.
-공통점
-key-value쌍으로 데이터를 저장한다는 면에서 동일한다.
-차이점
-HashTable: 멀티 스레드 환경에서 안전(thread safe)하게 객체를 추가, 삭제할 수 있습니다.
-HashMap: 빠른 대신에 동기화의 문제가 잇으며 이를 해결하기 위한 두 가지 방법이 있다.
-ConcurrentHashMap 사용
-Collections.synchronizedMap 사용
Map m = Collections.synchronizedMap(new HashMap(...));
'JAVA' 카테고리의 다른 글
스택 프레임(stack frame) (0) | 2022.10.05 |
---|---|
HashMap에 대하여 (0) | 2022.07.06 |
연산자 (0) | 2021.06.20 |
자바 데이터 타입, 변수 그리고 (0) | 2021.04.25 |
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가? (0) | 2021.04.18 |