HashMap 이란?
HashMap은 Map 인터페이스를 상속하고 있는 대표적인 컬렉션이다. 이름에 Hash가 들어가있는 것을 보면 알겠지만 Hashing 을 사용하고 있다. Map 인터페이스를 상속하고 있기 때문에 key와 value 로 구성된 Entry 객체를 저장한다.
HashMap 특징
- 삽입되는 순서와 들어 있는 위치가 관계가 없다.
- 중복된 value값은 가질 수 있지만, 중복된 key 값은 가질 수 없다.
- Hashing을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 성능이 뛰어나다.
HashMap 선언 및 메소드
HashMap 선언
HashMap<String,String> map = new HashMap<>(); //new에서 타입 파라미터를 생략한 HashMap 생성
HashMap<String,String> map = new HashMap<>(10); //capacity(초기 용량)을 지정한 HashMap 생성
HashMap<String,String> map = new HashMap<>(10,0.7f); //초기 capacity,load factor 지정한 HashMap 생성
HashMap을 초기 선언할때 타입 파라미터로는 key,value의 타입이 필요하다.
capacity(초기용량)와 load factor를 지정할 수 있다. capacity는 말 그대로 초기에 데이터를 저장할 용량을 말하는거고 load factor는 용량을 늘려줄 임계값을 의미한다. (10,0.7f)로 지정을 했으면 7개의 데이터가 들어가고 8개의 데이터가 들어갈 때 저장공간을 늘린다. 자바에서 HashMap은 용량이 차면 저장공간을 약 두배로 늘린다. 저장공간을 늘릴때 과부하가 많이 생기므로, capacity와 loadfactor를 지정해주는 것이 좋다.
HashMap 값 추가
map.put(key,value);
HashMap에 데이터를 추가하기 위해서는 put() 메소드를 사용한다.
키 값이 HashMap 에 이미 존재한다면, 기존의 값은 새로 입력되는 값으로 바뀐다.
HashMap 값 삭제
map.remove(key); //key값에 해당되는 객체 삭제
map.clear(); //전체 삭제
remove 메소드를 이용하여 특정 값을 삭제할수도 있고, clear 메소드를 이용하여 전체 값을 삭제할 수도 있다.
HashMap 값 출력
import java.util.*;
public class Main {
public static void main(String[] args) {
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)); //철수
System.out.println(map.getOrDefault(1,;
for(Map.Entry<Integer,String> entry : map.entrySet()){
System.out.println(entry.getKey() + " " + entry.getValue());
}
//1 철수
//2 영희
//3 진영
for(Integer key : map.keySet()){
System.out.println(key + " " + map.get(key));
}
//1 철수
//2 영희
//3 진영
}
}
HashMap을 출력하는 데에는 여러가지 방법이 있다.
println(map),println(map.get(key))을 이용해도 손쉽게 출력된다.
entrySet() 메소드를 이용해서 출력하는 방법도 있다.
entrySet()과, Map.Entry 객체 컬렉션을 이용하여서 getKey(),getValue() 메소드를 이용하면 key와 value 값 둘다를 손쉽게 얻을 수 있다. 이 방법이 효율적인 측면에서 가장 우수하다고 볼 수 있다.
Map.keySet()을 이용하여 출력하는 방법도 있다.
keySet()은 HashMap에 저장된 key들을 Set 객체로 리턴해준다.
isEmpty(), containsKey(), containsValue()
HashMap<Integer, String> map = new HashMap<>();
map.put(1,"철수"); map.put(2,"영희"); map.put(3."진영");
System.out.println(map.isEmpty()); //false
System.out.println(map.containsKey(1)); //true
System.out.println(map.containsKey(4)); //false
System.out.println(map.containsValue("철수")); //true
System.out.println(map.containsValue("민지")); //false
isEmpty는 HashMap이 비었으면 true, 아니면 false를 반환해주는 메소드이다.
containsKey는 인자로 받은 값이 HashMap의 key로 존재하면 true, 아니면 false를 반환해주는 메소드이다.
containsValue는 인자로 받은 값이 HashMap의 value로 존재하면 true, 아니면 false를 반환해주는 메소드이다.
replace()
HashMap<Integer, String> map = new HashMap<>();
map.put(1,"철수"); map.put(2,"영희"); map.put(3."진영");
System.out.println(map.replace(1,"민수"); //철수
System.out.println(map.replace(4,"영철"); //null
replace()는 입력받은 key의 value를 입력받은 value 값으로 교체한다. 그리고 교체되어지는 value 의 값은 리턴이 되며 삭제된다. 존재하지 않는 key가 인자로 전달되면 null을 리턴해준다.
getOrDefault()
getOrDefault(key, DefaultValue)
찾는 key가 존재하면 get(key)처럼 매핑되어 있는 값을 반환하고, 그렇지 않으면 입력받은 DefaultValue 값이 반환된다.
언뜻 봣을때는 사용하기 쉬워 보이지만, 코드를 짜면서 이 메소드를 사용하면서 기발한 방법을 많이 봤기때문에 사용하기도 까다롭고, 중요한 메소드라고 생각한다.
import java.util.*;
public class Main {
public static void main(String []args) {
String[] alphabet = {"A","B","C","A"};
HashMap<String, Integer> map = new HashMap<>();
for(String key : alphabet) {
map.put(key, map.getOrDefault(key, 0)+1);
}
System.out.println(map);
}
} //{A=2, B=1, C=1}
위는 사용예제이다.
alphabet이라는 String배열을 HashMap으로 바꾸는데, getOrDefault를 이용하여 key에는 알파벳이, value에는 알파벳의 개수를 넣었다.
'Language > JAVA' 카테고리의 다른 글
[JAVA] 이진트리에서 BFS 구현하기 (0) | 2022.09.01 |
---|---|
[JAVA] 이진트리에서 DFS 구현하기 (0) | 2022.09.01 |
[JAVA]Set 의 개념,종류 및 사용법 (0) | 2022.08.21 |
[Java] StringBuilder 정리 (0) | 2022.07.31 |