자바/자료구조

[Java] HashMap

backend dev 2022. 12. 4.

Map 인터페이스를 구현한 대표적인 Map 컬렉션, Map인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고있다.

Map은 키와 밸류값으로 구성된 자료구조이고 키와  밸류값은 모두 객체이다.

값은 중복될 수 있지만 키는 중복 될 수 없다.

기존에 저장된 키와 동일한 키을 넣으려고하면 기존의값은 없어지고 새로운값으로 대체된다.

HashMap은 해시함수를 통해 키와값이 저장되는 위치를 결정하므로,

사용자는 그 위치를 알 수없고, 삽입되는 순서와 들어 있는 위치 또한 관계가 없다고한다.

 

 HashMap 선언

HashMap<Integer, Integer> map = new HashMap<>(); // 기본적인 HashMap 생성방법
HashMap<Integer, Integer> map2 = new HashMap<>(10); // 초기용량을 지정가능
HashMap<Integer, Integer> map3 = new HashMap<>() { //초기값 지정가능
    {
        put(1, 2);
        put(2, 3);
    }
};

HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘리는데 List처럼 저장공간을 한 칸씩 늘리지 않고 약 두배로 늘린다고 한다.여기서 과부하가 많이 발생하므로 초기에 저장할 데이터 개수를 알고 있다면 Map의 초기 용량을 지정해주는 것이 좋다고 한다.

 

HashMap 값 추가

map.put(key,value)

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);
map.put("일번", 4); //이미 일번이라는 키값이 존재하는데 다시 값을 넣으면 value값이 1에서 4로 바뀐다.(새로넣는값으로 수정됨)

HashMap 값 삭제

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

map.remove("삼번");
map.clear();

오로지 키값을 이용해서 삭제가능.

모든값 제거는 clear()

 

HashMap 값 출력

해당 키값의 벨류값 얻기

map.get(key)

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

int result = map.get("일번"); // result에는 1이 저장

 

전체출력

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

System.out.println(map);

EntrySet 이용

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

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

KeySet 이용

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

for (String key : map.keySet()) {
    System.out.println("key : " + key + " value:" + map.get(key));
}

 

코드상 KeySet을 이용하는게 더 깔끔해보이지만

Entry를 이용하는것이 KeySet을 사용해 출력하는것보다 20~30% 속도가 빠르다고하니

EntrySet을 이용하자.

 

Iterator 사용

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

Iterator<Entry<String, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Entry<String, Integer> entry = entries.next();
    System.out.println("key : " + entry.getKey() + " value :" + entry.getValue());
}

하지만 인텔리제이가 Iterator을 사용하지않고 Entry만 이용하는걸 추천해준다.

 

 

 

HashMap 메소드

HashMap.putAll()

두개의 맵을 서로 합치는 putAll()

 isEmpty()

HashMap이 비어있는지 체크 (리턴 boolean값)

 

KeySet(),values()

KeySet()은 HashMap에 저장된 key들을 Set 객체로 리턴해준다.

public Set<K> keySet()

values()는 HashMap에 저장된 value들을 Collection 객체로 리턴해준다.

public Collection<V> values()
List<String> keyList = new ArrayList<>(map.keySet());
List<Integer> valueList = new ArrayList<>(map.values());

이렇게 리스트에 넣어서 사용가능 ( ArrayList 초기화할때 set객체와 Collection객체를 넣어서 초기화 가능하다.)

 

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

System.out.println("keyset : "+ map.keySet());
System.out.println("values : " + map.values());

 

HashMap.containsKey(),containsValue()

해당 키값이 존재하는지, 해당 벨류값이 존재하는지 체크 가능하다.

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

System.out.println(map.containsKey("일번"));
System.out.println(map.containsValue(1));

 

HashMap.replace()

public V replace(K key, V value)

해당 키값이 존재한다면 전달한 value값으로 교체해주고, 없다면 null을 리턴

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

System.out.println("수정전:" + map);
map.replace("일번", 55);
System.out.println("수정후:" + map);

 

public boolean replace(K key, V oldValue, V newValue)

해당 키값의 벨류값이 oldValue와 같다면 newValue로 바꿔주고 성공시 true를 리턴

실패시 false를 리턴해준다.

저장된 key의 value가 oldValue와 동일할 때만 newValue로 변경해 준다.

 

내가 찾는 value값을 다른걸로 바꾸고 싶을때 사용하면 될듯하다.

HashMap<String, Integer> map = new HashMap<>();
map.put("일번", 1);
map.put("이번", 2);
map.put("삼번", 3);

System.out.println("수정전:" + map);
System.out.println(map.replace("일번", 1 ,100));
System.out.println("수정후:" + map);

 

HashMap.getOrDefault()

찾는 키가 존재한다면 찾는 키의 벨류값을 반환하고 없다면 설정한 기본값을 반환하는 메소드

 

getOrDefault(Object key, V DefaultValue)
  • key : 값을 가져와야 하는 요소의 키입니다.
  • defaultValue : 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값입니다.

반환 값 : 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환됩니다.

 

응용할곳 -> 빈도수 체크할때

String [] alphabet = { "A", "B", "C" ,"A"};
HashMap<String, Integer> hm = new HashMap<>();
for(String key : alphabet) hm.put(key, hm.getOrDefault(key, 0) + 1);
System.out.println("결과 : " + hm);

hm.put(key, hm.getOrDefault(key, 0) + 1

에서 해당 key값이 존재한다면 그 key값의 value를 가져와 +1 해주고 다시 넣어준다.

(원래있는 키값에 대해 put하면 새로운 value값으로 바뀌므로)

 

해당 key값이 없다면 getOrDefault(key,0)의 리턴은 0일테니까 

해당 key값의 value는 0 + 1 로 1이 저장된다.

 

 

 

 

HashMap 시간복잡도

 

value값 기준으로 정렬하기

keySet을 받아 저장하고-> keySet은 Set이므로 List로 바꿔서 저장해준다. (정렬해야하니까 인덱스가 있는 리스트 자료구조를 사용한다)

Comparator를 구현하여 value값을 기준으로 정렬해준다.

List<Integer> keySet = new ArrayList<>(map.keySet());
keySet.sort(new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return map.get(o1)-map.get(o2);
    }
});

Entry를 이용하여 정렬하기

https://ponyozzang.tistory.com/404

 

JAVA Map 키(Key) 값(Value) 정렬 방법과 자동 정렬 예제

자바에서 HashMap에 저장한 데이터를 키(Key) 또는 값(Value)으로 정렬하는 방법을 알아보겠습니다. HashMap 키(Key) 정렬 먼저 HashMap을 키(Key)로 정렬하는 방법을 보겠습니다. HashMap을 정렬하기 위해서는

ponyozzang.tistory.com

 

https://keeeeeepgoing.tistory.com/242

 

★프로그래머스3/베스트앨범/Map,Comparator,class

하나의 Map을 이용해서 풀려고하니 복잡해진 문제 2개의 Map으로 나눠도 좀 복잡하긴하다. Map을 정렬하려면 EntrySet를 이용해서 정렬하던지 Map안에 정렬가능한 List같은 collection객체를 넣던지 해야

keeeeeepgoing.tistory.com

 

 

 

 

 

 

 

 

 


 

[Java] Map을 Key, Value로 정렬하기

Java에서 HashMap 정렬이 필요할 때, 그 방법에 대해 알아볼 것이다.정렬 기준은 key, value 두가지로 나눌 수 있다.map 의 keySet을 이용하여 정렬한다.오름차순 시에는 Collection.sort(), 내림차순 시에는 Col

velog.io

 

 

 

참고, 더 자세한 내용

 

[Java] 자바 HashMap 사용법 & 예제 총정리

HashMap 이란? HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다. Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있습니다. Map은 키와 값으로 구성된 Entry객체를 저장하는

coding-factory.tistory.com

 

Java - HashMap 사용 방법 및 예제

HashMap은 Map의 일종으로 key와 value의 쌍으로 이루어진 데이터를 보관합니다. HashMap은 데이터의 저장순서를 보장하지 않으며 null을 허용합니다. 또한 put, putAll, get, remove, keySet, values 등의 API들을 제

codechacha.com

 

 

 

[JAVA] Map - getOrDefault 이란? 사용법 및 예제

getOrDefault - 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드 사용 방법 getOrDefault(Object key, V DefaultValue) 매개 변수 : 이 메서드는 두 개의 매개 변수를 허용합니

junghn.tistory.com

 

'자바 > 자료구조' 카테고리의 다른 글

[Java] 우선순위 큐 (Priority Queue)  (0) 2022.12.24
[Java] Heap, 힙 , 트리, 이진트리, 완전 이진트리  (0) 2022.12.24
[Java] Stack, 스택  (0) 2022.12.20
[Java] Set [HashSet]  (0) 2022.12.05
[Java] ArrayList, LinkedList  (0) 2022.12.03

댓글