본문 바로가기

JAVA

HashMap 동작 방식에 대해 설명하세요.

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