Knowledge/자료구조

[자료구조] 해시맵(HashMap)

똑똑한망치 2023. 11. 16. 22:40
728x90
반응형

1. 해시맵 (HashMap) 이란 무엇일까?


  • map 인터페이스를 구현한 대표적인 클래스
  • HashMap은 키(Key)와 값(Value) 이 1:1구조로 구성된 객체를 저장하는데, 이 객체를 Entry 객체라고 한다.
  • HashMap의 개별 요소가 되는 Entry 객체는 Map 인터페이스의 내부 인터페이스인 Entry 인터페이스를 구현한다.
  • HashMap은 해시 함수를 통해 키와 값이 저장되는 위치를 결정한다. 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 위치도 관계가 없다. 해시 함수를 통해 데이터를 관리하는 자료 구조로 많은 양의 데이터를 검핵하는 데 있어서 뛰어난 성능을 보인다.
  • 키는 맵에서 유일한 값을 가져야 하고, 값은 중복된 값이어도 상관 없다. 키는 대소문자를 구별한다.

 

 

 



 

※ 맵 (Map) 

  • 키와 값을 하나의 쌍으로 저장하여 데이터를 관리하는 자료구조
  • 데이터의 순서가 없다.

 

 


 

 

 

(1) 주의할 점

  • Map은 키와 값을 쌍으로 저장하기 때문에 iterator() 메서드를 직접 호출할 수 없다.
  • 따라서, keySet() 메소드 또는 entrySet() 메소드를 이용하여 Set 형태로 변환된 컬렉션에 iterator() 메소드를 호출해야한다.
  • 값에 대한 Set() 메소드는 지원하지 않는다. 왜냐하면, 값은 중복이 허용되기 때문이다.
  • entrySet의 경우, Iterator 타입 매개변수에 Map.Entry 객체 타입으로 받아야 한다.
Iterator<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();

 

 

 

 


 

 

2. HashMap 코드


(1) HashMap 생성

  • HashMap 을 생성할 때, 타입 파라미터에는 키와 값의 타입을 따로 지정해 주어야 한다.
import java.util.HashMap;

HashMap<String, String> map = new HashMap<>();   //String 타입의 Key, String 타입의 value

 

 

 

(2) HashMap의 데이터 삽입

  • put(key, value) 메소드 사용
import java.util.HashMap;

HashMap(String, String> map = new HashMap<>();   //String 타입의 Key, String 타입의 value

map.put("apple","사과");
map.put("pineapple","파인애플");
map.put("kiwi","키위");

 

 

 

 

(3) HashMap의 데이터 접근

  • get(key) 메소드 사용
  • getOfDefault (key, defaultValue) 메소드는 HashMap에 해당 key값이 존재하지 않을 시 defaultValue를 반환한다.
import java.util.HashMap;

HashMap(String, String> map = new HashMap<>();   //String 타입의 Key, String 타입의 value

map.put("apple","사과");
map.put("pineapple","파인애플");
map.put("kiwi","키위");

String value1 = map.get("apple");    // "사과"

String value2 = map.getOrDefault("blueberry", "값이 없습니다");
// HashMap에 "blueberry" 가 존재하지 않을 경우 "값이 없습니다" 반환

 

 

 

 

(4) HashMap의 데이터 삭제

  • remove(key) 메소드 사용
  • clear() 메소드는 HashMap 의 모든 키 값을 삭제
  • Map은 기본적으로 key 값을 이용하여 값에 접근하다.
import java.util.HashMap;

HashMap(String, String> map = new HashMap<>();   //String 타입의 Key, String 타입의 value

map.put("apple","사과");
map.put("pineapple","파인애플");
map.put("kiwi","키위");

map.remove("apple");    // key값을 이용하여 데이터 삭제

map.clear();    // HashMap에 있는 모든 키 값을 삭제

 

 

 

(5) HashMap의 Entry 객체 데이터 가져오기

  • getKey() : Entry 객체의 key 값 반환
  • getValue() : Entry 객체의 value 값 반환

 

(6) HashMap의 데이터 가져오기

  • 키와 값 가져오기
    • entrySet() 메서드 사용
Map<String, Integer> map = new HashMap<>();
map.put("John", 34);
map.put("Jane", 26);
map.put("Billy", null);


for (Map.Entry<String, Integer> m : map.entrySet()) {
  System.out.println(String.format("Key (name) is: %s, Value (age) is : %s", m.getKey(), m.getValue()));
}

 

 

  • 키만 가져오기
    • keySet() 메서드 사용
    • keySet() 은 키값들의 집합
    • 모든 키를 순회할 때 사용 가능
for (String key : map.keySet()) {
  System.out.println(key);
}


//for-each 문을 사용하여 모든 키 출력
for (String key : keySet()) {
	System.out.println(key);
}

 

 

  • 값만 가져오기
    • values() 메서드 사용
for (String key : map.values()) {
  System.out.println(key);
}

 

 

 

  • 특정 키가 존재하는지 확인하기
    • containsKey() 메서드 사용, 키가 존재한다면 true를 반환하고 존재하지 않는다면 false 를 반환
boolean result = map.containsKey("Jane");
System.out.println(result);

 

 

  • 특정 값이 존재하는지 확인하기
    • containsValue() 메서드 사용, 값이 존재한다면 true 를 반환하고 존재하지 않는다면 false를 반환
반응형