[자료구조] 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값을 반환한다.
댓글남기기