본문 바로가기
개발/Java

Map - HashMap 사용하는 방법

by Devsong26 2017. 11. 3.

- HashMap이란?

Map 인터페이스를 구현한 Hash table입니다. 

HashMap 객체에는 (key, value)쌍으로 데이터를 입력할 수 있습니다. 

 

* (key, value)쌍을 entry라고 부릅니다.

 

 

- 특징

1. key, value값으로 null을 허용합니다.

2. 동기화가 되지 않기 때문에 멀티스레드 환경에서는 각별히 주의해야 합니다.

3. 입력되는 데이터는 정렬되지 않습니다.

4. 객체에 저장된 데이터에 접근하기 위해서는 Iterator클래스 객체를 사용해야 합니다.

 

* 동기화가 되는 HashMap을 생성하는 방법

Map<generic, generic> map = Collections.synchronizedMap(new HashMap<generic, generic>());

 

* Iterator 사용시 주의할 점

Iterator 객체를 iterator() 메소드를 호출하여 가져온 다음에 HashMap의 데이터를 수정하면 

ConcurrentModificationException이 발생합니다.

 

 

- 생성자

 

//첫번째 생성자

HashMap<String, Integer> map1 = new HashMap<String, Integer>();
//두번째 생성자
HashMap<String, Integer> map2 = new HashMap<String, Integer>(10);
//세번째 생성자
HashMap<String, Integer> map3 = new HashMap<String, Integer>(20, 3.0f);
//네번째 생성자
HashMap<String, Integer> map4 = new HashMap<String, Integer>(map1);

 

첫번째 생성자는 기본 생성자로써 initial capacity가 16이고, load factor가 0.75인 빈 HashMap객체를 생성합니다.

 

두번째 생성자는 매개변수로 initial Capacity를 int 데이터로 입력합니다. 

생성된 HashMap 객체는 입력된 매개변수 수치만큼의 initial Capacity를 가지며, load factor는 0.75값을 가집니다.

 

세번째 생성자는 매개변수로 int initialCapacity, float loadFactor를 입력하고 그값을 가진 빈 HashMap객체를 생성합니다.

 

네번째 생성자는 매개변수로 map 인터페이스의 객체를 입력받습니다. 생성된 HashMap은 입력된 Map 객체와 동일한 mappings를 가집니다. 

mappings : key, value의 쌍

 

* capacity와 load factor란? 

capacity는 key, value의 entry를 담을 bucket의 수입니다. 

load factor는 HashMap객체에 entry가 가득찬 수준을 측정합니다.

load factor수준까지 entry가 찼을 경우 대략 capacity의 두배의 bucket을 생성 후 entry mapping을 rehashing합니다.

 

 

- 메소드

모든 메소드를 설명하지 않습니다.

 

(1) clear()

HashMap객체의 모든 entry를 삭제합니다.

 

(2) containKey(Obejct key)

HashMap객체에 매개변수 key에 해당하는 key값이 존재하면 true, 없으면 false를 반환합니다.

 

(3) containValue(Object value)

HashMap객체에 매개변수 value에 해당하는 value값이 존재하면 true, 없으면 false를 반환합니다. 

 

(4) entrySet()

 

map1.put("a", 1);

map1.put("b", 2);
map1.put("c", 3);
map1.put("d", 4);

//Set<Map.Entry<String, Integer>> 객체를 얻는 메소드
Set<Map.Entry<String, Integer>> set = map1.entrySet();
Iterator it = set.iterator();

while(it.hasNext()){
  Object obj = it.next();
  System.out.println(obj);
}

System.out.println();

for(Map.Entry<String, Integer> entry : map1.entrySet()){
  String key = entry.getKey();
  Integer value = entry.getValue();
  System.out.println(key + " " + value);
}

 

 

 

Set<Map.Entry<K,V>>의 객체를 반환하는 메소드이며 사용법은 위의 코드와 같습니다. 

테스트해보니 Set<Map.Entry<K,V>> set의 Iterator의 generic을 사용할 경우 컴파일 에러가 납니다. 

그래서 generic을 지정하지 않고 Iterator 객체를 얻어와서 while문 안에서 set의 객체를 하나씩 확인해보니 

a=1의 형태로 출력이 됩니다.

그리고 아래의 for문은 entrySet()의 메소드를 사용한 다른 예시입니다. 

이 때는 entry 객체에서 getKey()메소드를 호출하여 key값, getValue()메소드를 호출하여 value값을 얻어올 수 있습니다.

 

(5) get(Object key)

매개변수로 key값을 입력하여 key와 mapping된 value값을 반환합니다. 없을 경우 null을 반환합니다. 

 

(6) getOrDefault(Object key, V defaultValue)

매개변수로 key를 입력하고,  key에 mapping된 value값이 있다면 그 값을 반환합니다.

없을 경우 입력된 defaultValue를 반환합니다.

 

(7) isEmpty()

HashMap객체의 데이터가 하나도 없을 경우 true, 아닐 경우 false를 반환합니다. 

 

(8) keySet()

HashMap객체의 key값들이 저장된 Set<K> 객체를 반환합니다. 

 

(9) put(K key, V value)

매개변수로 입력된 (key, value) entry를 HashMap객체에 연관(추가)시킵니다.

단, 주의할 것은 동일한 key값을 넣어 add를 할 경우 이전의 value 데이터는 삭제되고 입력한 value값이 mapping됩니다.

 

(10) putAll(Map<? extends K, ? extends V> m)

매개변수로 입력된 map객체의 모든 entry를 HashMap객체에 연관(추가)시킵니다.

입력되는 map객체에 HashMap객체의 Key값과 동일한 Key값이 있을 경우 Map객체의 value값이 key값에 mapping됩니다.

 

(11) putIfAbsent(K key, V value)

key값에 해당하는 value가 존재하지 않는다면 (key, value) entry를 HashMap객체에 연관시키고 null을 반환합니다. 

key에 해당하는 value값이 존재한다면 그값을 반환합니다. 

 

(12) remove(Object key)

key값에 해당하는 value값이 있다면 HashMap객체에서 삭제합니다. 그리고 그 값을 반환합니다. 

이때 key값도 같이 삭제됩니다. 

 

(13) remove(Object key, Object value)

(key, value) entry가 있을경우 그값을 삭제하고 true, 없을경우 false를 반환합니다.

이 때 key와 value가 HashMap객체에 mapping된 entry와 동일해야지 삭제됩니다.

 

(14) replace(K key, V value)

HashMap객체에서 key에 해당하는 value를 입력된 value로 대체하고 이전의 value값을 반환합니다. 

key값이 없을 경우 null을 반환합니다.

 

(15) replace(K key, V oldValue, V newValue)

key해당하는 value가 입력된 oldValue와 같을 경우 oldValue를 newValue로 대체한 후 true를 반환합니다.

oldValue가 key에 해당하는 value값과 같지 않을 경우 false를 반환하고 newValue값으로 대체되지 않습니다.

 

(16) size()

(key, value) entry의 총 개수를 반환합니다. 

 

이상으로 HashMap 사용하는 방법을 마칩니다. 

 

 


더 많은 내용을 보시려면 아래를 참고하세요.


블로그의 다른 글

 

Map - TreeMap 사용하는 방법

- TreeMap이란? NavigableMap 인터페이스를 구현한 Red-Black tree입니다. key값에 의해 정렬이 되는데, 생성자에 Comparator객체를 입력하여 생성할 경우 Comparator의 compare메소드에 의해 정렬이 이루어집니다..

developer-syubrofo.tistory.com

 

Map - LinkedHashMap 사용하는 방법

- LinkedHashMap이란? Map 인터페이스를 구현한 클래스이며 동시에 Linked LIst이면서 Hash table입니다. - 특징 (1) 입력했던 순서대로 Entry가 LinkedHashMap에 mapping됩니다. (2) LinkedHashMap은 double-link..

developer-syubrofo.tistory.com

 

maven없이 스프링(Spring) 프로젝트 만들기 (1) - 프로젝트 생성하기

maven 외부 저장소에서 라이브러리를 프로젝트에 포함시킬 때 간혹 문제가 발생하는 경우가 있어서 maven이 없는 스프링 프로젝트를 만들어 보겠습니다. - Dynamic Web Project 생성하기 프로젝트 이름

developer-syubrofo.tistory.com

 

maven없이 스프링(Spring) 프로젝트 만들기 (2) - 웹 앱 실행하기

1부에서 작업한 코드로는 웹 프로젝트를 실행할 수 없습니다. 추가 작업을 하겠습니다. Java Resources -> src 우클릭 합니다. Name에 "spring.home.controller"를 입력 후 "Finish"를 누릅니다. 생성된 패키..

developer-syubrofo.tistory.com

 

maven없이 스프링(Spring) 프로젝트 만들기 (3) - 디비(DB, Database) 연동하기 #1

스프링 디비 연동 포스팅은 3파트로 나뉩니다. (1) DB 드라이버, ibatis, mybatis.jar 다운받기 및 셋팅 (2) DTO, DAO, mybatis 작업하기 (3) view 페이지 작업, Controller 작업하기 지금 보실 내용은 (1) DB..

developer-syubrofo.tistory.com