[JAVA] hashMap이란?

이지연·2021년 1월 4일
0

hashMap?

Map인터페이스의 한종류, key-value 값으로 데이터를 하나로 묶어 entry로 저장하는 형태이다.

저장은 느리다는 단점이 있다. 하지만, hashing이란 해시함수를 이용해서 데이터를 해시테이블에 저장하고 검색하는 기법을 말하는데, hashing을 사용하기 때문에 많은 양의 데이터를 검색하는 데 뛰어난 성능을 보인다. hashMap보다 TreeMap은 저장이 빠르지만 데이터를 가져올 때 느리다.

그렇다면 Map은 어떤 걸까?
Map이란 ("Key", Value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스들을 구현 하는 데 사용되는 것이다.

특징

  • key값은 중복이 불가능, value는 null값을 포함한 value로 중복이 가능하다.
    그래서 데이터와 중복된 키와 값을 저장하면, 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.

  • 멀티쓰레드에서 동시에 HashMap을 건드려 Key-value값을 사용하면 문제가 될 수 있다. 멀티쓰레드에서는 HashMap이라는 것을 사용한다.

종류

  • HashTable, HashMap, LinkedHashMap, SortedMap, TreeMap 등 존재

HashMap 의 생성자와 메서드 정리

HashMap과 관련된 프로그래머스 문제

문제

숫자로 이루어진 배열인 nums를 인자로 전달합니다.
숫자중에서 과반수(majority, more than a half) 가 넘은 숫자를 반환해주세요.


예를들어,
num[3,2,3]
return 3
nums = [2,2,1,1,1,2,2]
return 2


#가정
nums 배열의 길이는 무조건 2개 이상

import java.util.HashMap;
import java.util.Map.Entry;

class Solution {
    public int solution(int[] numbers) {
        //key와 value 모두 정수 타입인 HashMap인스턴스를 생성
        HashMap<Integer, Integer> map = new HashMap<>();
        
		//for each 문의 구조를 이용해서  numbers에 있는 리스트를 num에 넣어주기
        for(int num : numbers) {
            try {
                map.put(num, map.get(num)+1); //map은 put을 이용해 key, value 저장
                // get 메소드를 이용하면 value값에 +1해주기
                // why? 해당 key값의 갯수를 세기 위해서 
            }catch(Exception e) {
                map.put(num, 1); //앞에 map에서 갖고온 값이 없을 때 1로 넣어주기
            }
        }
		

        for(Entry<Integer, Integer> entry: map.entrySet()) {
        //entry에 값이 numbers의 수보다 절반이상 초과하면 해당 numbers의 숫자를 리턴시켜준다.
            if(entry.getValue() > numbers.length/2) {
                return entry.getKey();
            }
        }

        return -1;
    }
}
  • map.entrySet()

Map에 값을 전체 출력하기 위해서는 entrySet(), keySet() 메소드를 사용하면 되는데 entrySet() 메서드는 key와 value의 값이 모두 필요한 경우 사용하고, keySet() 메서드는 key값만 필요한 경우 사용한다.

참고:) Iterator 인터페이스를 사용할 수 없는 컬렉션인 Map에서 Iterator 인터페이스를 사용하기 위해서는 Map에 entrySet(), KeySet() 메소드를 사용하여 Set객체를 반환 받은 후에 Iterator 인터페이스를 사용하면 된다.

profile
Everyday STEP BY STEP

1개의 댓글

comment-user-thumbnail
2022년 8월 5일

안녕하세요. 글 재미있게 읽었습니다. 다만, map에서 get으로 가져올 때 getOrDefault() 메소드를 사용하면 try-catch 없이 깔끔한 코드를 만들 수 있지 않을까 싶어서 주제넘게 한말씀 올립니다.

답글 달기