슬기로운 개발생활

[Java] HashMap

by coco3o
반응형

HashMap 이란?

HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다.

Map은 키와 값으로 구성된 Entry 객체를 저장하는 구조를 가지고 있는 자료구조이고 여기서 키와 값은 모두 객체이다.

값은 중복 저장될 수 있지만 키는 중복 저장될 수 없다.

만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.

HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.

출처 : https://coding-factory.tistory.com/556

HashMap은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 들어 있는 위치 또한 관계가 없다.


HashMap 사용법

HashMap 선언

HashMap<String,String> map1 = new HashMap<String,String>();//HashMap생성

HashMap<String,String> map2 = new HashMap<>();//new에서 타입 파라미터 생략가능

HashMap<String,String> map3 = new HashMap<>(map1);//map1의 모든 값을 가진 HashMap생성

HashMap<String,String> map4 = new HashMap<>(10);//초기 용량(capacity)지정

HashMap<String,String> map5 = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정

HashMap<String,String> map6 = new HashMap<String,String>(){{//초기값 지정
    put("a","b");
}};

HashMap을 생성하려면 키 타입과 값 타입을 파라미터로 주고 기본 생성자를 호출한다.

HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 공간을 한 칸씩 늘리지 않고 약 두배로 늘린다. (과부하 발생)
그렇기에 초기에 저장할 데이터 개수를 알고 있다면 Map의 초기 용량을 지정해주는 것이 좋다.



HashMap 값 추가

HashMap<Integer,String> map = new HashMap<>();//new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");

put(key, value) 메소드를 사용하면 된다.



HashMap 값 삭제

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
map.remove(1); //key값 1 제거
map.clear(); //모든 값 제거


HashMap 값 출력

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
		
System.out.println(map); //전체 출력 : {1=사과, 2=바나나, 3=포도}
System.out.println(map.get(1));//key값 1의 value얻기 : 사과
		
//entrySet() 활용
for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

//KeySet() 활용
for(Integer i : map.keySet()){ //저장된 key값 확인
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

HashMap을 출력하는 방법에는 다양한 방법이 있다.

그냥 print하게 되면 { }로 묶어 Map의 전체 key값, value가 출력된다.

특정 key값의 value를 가져오고 싶다면 get(key)를 사용하면 되고,
전체를 출력하려면 entrySet()이나 keySet()메소드를 활용하여 Map의 객체를 반환받은 후 출력하면 된다.

entrySet()은 key와 value가 모두 필요할 경우 사용하며
keySet()은 key 값만 필요할 경우 사용하는데 key값만 받아서 get(key)를 활용하여 value를 출력할 수도 있다.
하지만, key 값을 이용해 value를 찾는 과정에서 시간이 많이 소모되므로 많은 양의 데이터를 가져와야 한다면 entrySet()이 좋다.
(약 20%~200% 성능 저하가 있다고 한다.)



Iterator 사용

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
		
//entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Map.Entry<Integer, String> entry = entries.next();
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" +  entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
		
//keySet().iterator()
Iterator<Integer> keys = map.keySet().iterator();
while(keys.hasNext()){
    int key = keys.next();
    System.out.println("[Key]:" + key + " [Value]:" +  map.get(key));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

HashMap의 전체출력시 Iterator를 사용하여도 된다.


References : 이것이 자바다 15장 컬렉션 프레임워크
coding-factory.tistory.com/556

반응형

'📚Computer Science > Data structure' 카테고리의 다른 글

[Java] TreeMap  (0) 2021.05.11
[Java] TreeSet  (0) 2021.05.11
[Java] HashSet  (0) 2021.05.11
[Java] Vector  (0) 2021.05.10
[Java] LinkedList  (0) 2021.05.10

블로그의 정보

슬기로운 개발생활

coco3o

활동하기