[자료구조] Java HashMap 사용법 및 총정리

업데이트:




✅ HashMap이란 ?

HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. Map 인터페이스를 상속하고 있기 때문에 Map의 성질을 그대로 사용할 수 있다. 키(Key)와 값(Value)로 구성된 객체를 저장하는 구조를 가지는데, 값은 중복 저장될 수 있지만, 키는 중복 저장될 수 없다. 또한 HashMap은 이름 그대로 Hashing을 사용하기 때문에 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.

위 그림처럼 HashMap은 내부에 ‘키’와 ‘값’을 저장하는 구조를 띄는데, 해시 함수를 통해 키와 값이 저장되는 위치를 결정하기 때문에, 사용자는 저장된 위치를 알 수 없고 삽입되는 순서 또한 저장 위치와 관계가 없다.







✅ HashMap 사용법

📌 HashMap 선언

HashMap<String,String> map1 = new HashMap<String,String>();	// HashMap 생성
HashMap<String,String> map2 = new HashMap<>();			// 타입 파라미터 생략 가능
HashMap<String,String> map3 = new HashMap<>(map1);		// map1의 모든 값을 가진 HashMap 생성
HashMap<String,String> map4 = new HashMap<>(10);		// 초기화 크기 지정

HashMap은 키,값을 파라미터로 설정하고 기본생성자를 호출하면 생성할 수 있다. 타입 파라미터는 생략 가능하다. 동적으로 메모리를 할당 하기 때문에 사이즈를 정해줄 필요가 없지만 초기 크기를 설정하는 것도 가능하다.



📌 HashMap 값 추가


HashMap<Integer,String> map = new HashMap<>();
map.put(1,"엄마");
map.put(2,"아빠");
map.put(3,"동생");

HashMap에 값을 추가할 때는 put(key,value) 메소드를 사용할 수 있다. 이때 HashMap은 중복키값을 허용하지 않기 때문에 기존에 존재하는 키값을 또 추가한다면 기존 value는 새로운 value로 갱신된다.



📌 HashMap 값 삭제


HashMap<Integer,String> map = new HashMap<>();
map.put(1,"엄마");
map.put(2,"아빠");
map.put(3,"동생");

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

HashMap의 값을 제거하려면 remove(key) 메소드를 사용하면 된다. 오직 키 값을 가지고 요소를 삭제할 수 있다. clear() 메소드는 HashMap의 모든 값을 제거하고 메모리 누수를 최소화 하기 위해 HashMap 사용 완료후 반드시 추가해주는 습관을 들이는 것이 좋다.



📌 HashMap 값 출력


HashMap<Integer,String> map = new HashMap<>();
map.put(1,"엄마");
map.put(2,"아빠");
map.put(3,"동생");


System.out.println(map);		// {1=엄마, 2=아빠, 3=동생}
System.out.println(map.get(1));		// 엄마


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

//  keySet() 활용
for(Integer i : map.keySet()) {
	System.out.println(i + " " + map.get(i));
}

HashMap은 일반적인 List나 Array를 출력하는 방법과는 다른 방식으로 출력할 수 있다. List나 Array는 입력한 순서에 따라 배열에 차례대로 값을 저장할 수 있지만, HashMap은 해시함수를 통해 값을 저장하기 때문에 사용자가 값이 저장되는 위치를 알 수 없다. 때문에 일반적인 방법으로 출력할 수 없고 entrySet() 이나 keySet() 메소드를 사용하여 출력해야 한다.

enteySet()은 forEach문과 함께 사용하면 편리하다. Entry객체를 하나 만들고 Entry객체에 map을 넣어준다음 getKey(), getValue() 로 값을 가져오면 된다.

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

keySet()HashMap의 key값만 저장하는 메소드인데 key값만 알고있다면 value는 자동으로 알 수 있기 때문에 코드가 간편한 keySet() 을 활용하는 경우가 많다. 그러나 성능만 놓고 보면 EntrySet()이 훨씬 좋기 때문에 대용량데이터를 처리해야 한다면 EntrySet()을 권장한다.

for(Integer i : map.keySet()) {
	System.out.println(i + " " + map.get(i));
}



📌 HashMap 값 출력 - Iterator


HashMap<Integer,String> map = new HashMap<>();
map.put(1,"엄마");
map.put(2,"아빠");
map.put(3,"동생");

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

Iterator<Integer> keys = map.keySet().iterator();
while(keys.hasNext()){
	int key = key.next();
	System.out.println(key + " " + map.get(key));
}

HashMap에 대한 전체요소를 출력하고자 할때는 Iterator를 사용해 출력할 수 도 있다.



📌 HashMap 값 수정


HashMap<Integer,String> map = new HashMap<>();
map.put(1,"엄마");
map.put(2,"아빠");
map.put(3,"동생");

map.replace(1,"새엄마");
map.replace(2,"새아빠");

replace(key,value) : key에 해당하는 value를 변경할 수 있다.



📌 HashMap 값 확인


HashMap<Integer,String> map = new HashMap<>();
map.put(1,"엄마");
map.put(2,"아빠");
map.put(3,"동생");

map.containsKey(1);			// true
map.containsValue("엄마");		// true
map.isEmpty();				// false
map.size();				// 3
  • containsKey(key) : key와 일치하는 데이터가 있는지 확인 ( 있으면 true)
  • containsValue(value) : value와 일치하는 데이터가 있는지 확인 ( 있으면 true)
  • isEmpty() : HashMap이 비어있는지 확인 ( 비었으면 true )
  • size() : HashMap의 key-value 쌍 개수 반환



📌 HashMap 값 반환


  • get(key) : key와 맵핑된 value 반환
  • getOrDefault(key, DefaultValue) : key와 맵핑된 value값을 반환하고 value값이 없으면 defaultValue값을 반환한다.



댓글남기기