Contents

[Java] HashMap Class


Java HashMap Class 를 알아보자.

먼저 HashMap 은 탐색에 매우 효율적이다.

  • Key-value pair 로서 값을 저장한다.
  • key 값과 value 값을 hashfunction 을 이용해 매우 빠르게 찾는다.
  • 탐색시 O(1) 의 성능을 보인다.

해당 사이트들을 참고하여 작성하였다.

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

https://coding-factory.tistory.com/556



import

HashMap<K,V>

  • K - key 값의 type
  • V - value 값의 type
import java.util.HashMap;


Constructors

default load factor - 0.75

HashMap()

HashMap<String, String> map = new HashMap<String, String>();
HashMap<String, String> map = new HashMap<>(); 

HashMap(int initialCapacity)

선언시에 미리 사이즈를 정해두면 메모리 공간에 상당히 도움된다. 크기를 알 수 있다면 initialCapacity 를 설정 해 두도록 하자.

HashMap<String, String> map = new HashMap<>(10);

HashMap(init initialCapacity, float loadFactor)

HashMap<String, String> map = new HashMap<>(10,0.7f);

HashMap(Map<? extennds K, extends V> m)

HashMap<String, String> map = new HashMap<String,String>(){{
	put("key","value");
}};


Methods

HashMap 클래스의 기본적인 함수들이다. 사용 법은 hm.함수명; 이런식으로 쓰면된다.

clear, clone

  • clear() -> void

    모든 매핑을 삭제한다.

  • clone() -> Object

    객채에 대한 얕은 복사(Shallow copy)를 한다. (주소값만 복사)

map.clear(); //모든 값 제거

contains

  • containsKey(Object key) -> boolean

    key 값이 존재하면 true 반환

  • containsValue(Object value) -> boolean value

    value 값 존재하면 true 반환

Set

Key 와 Value 값을 순환할때는 entrySet() 을 하는 것이 더 효율적이다. KeySet() 을 사용하면 map.get() 함수를 써야해서 성능이 하락된다.

  • entrySet() -> Set<Map.Entry<K,V»

    mapping 에 대한 집합 view 를 반환

  • keySet() -> Set

    키값들에 대한 집합 view 를 반환

//entrySet() 
for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.printlnentry.getKey() + " : " + entry.getValue());
}

//KeySet() 
for(Integer i : map.keySet()){ //저장된 key값 확인
    System.out.println(i + " : " + map.get(i));
}

// Entry.setValue() 이용 모든 값에 10 더하기
for (Map.Entry<String,Integer> item : map.entrySet()){
    item.setValue(item.getValue() + 10);
}

get

  • get(Object key) -> V

  • getOrDefault(Object key, V defaultValue) -> V

    키에 대한 값이 존재: 값 반환

    키에 대한 값이 존재 X: defaultValue 매핑

// Minsoo 키값이 존재: 기존 value + 1
// Minsoo 키값이 존재 X: 0 + 1
map.put("Minsoo", map.getOrDefault("Minsoo", 0) + 1)
  • isEmpty() -> boolean

put

  • put(K key, V value) -> V

  • putAll(Map<? extends K, ? extends V> m) -> void

    모든 mapping 값을 복사한다.

  • putIfAbsent(K key, V value) -> V

    key값이 mapping 되어있지 않다면 해당 value 로 mapping 한다.

map.put(1,"사과");
// 기존 Minsoo 키값에 대한 value 값 -1 업데이트
map.put("Minsoo", map.get("Minsoo") - 1);

remove

  • remove(Object key) -> V

  • remove(Object key, Object value) -> boolean

    key 값이 해당 value 와 mapping 되어 있을 때만 삭제

map.remove(1); //key값 1 제거

replace

  • replace(K key, V value) -> V

  • replace(K key, V oldValue, V newValue) -> boolean

  • replaceAll(BiFunction<? super K,? super V,? extends V> function) -> void

map.replaceAll((key, value) -> {
  if(key.contains("Script")) {
    return value * 10;
  }
  return value;
});

size, values

  • size() -> int

  • values() -> Collection

// values() 값들 ArrayList 로 변환
List<Integer> length_list = new ArrayList<>(hm.values());


HashMap Sorting

import java.util.Map;
import java.util.HashMap;
import java.util.Collections;
import java.util.List;
import java.util.Comparator;
import java.util.ArrayList;

key ArrayList 선언

List<Integer> keyList = new ArrayList<>(map.keySet());

value 값 기준 오름차순 정렬

Collections.sort(keySetList, (o1, o2) -> (map.get(o1).compareTo(map.get(o2))));

value 값 기준 내림차순 정렬

Collections.sort(keySetList, (o1, o2) -> (map.get(o2).compareTo(map.get(o1))));

key 값 기준 오름차순 정렬

Collections.sort(keySetList);