HashMap
- Map 인터페이스를 구현한 대표적인 Map 컬렉션
- Map은 키와 값으로 구성된 Entry 객체를 저장하는 구조를 가지고 있는 자료구조이고 여기서 키와 값은 모두 객체
- 값은 중복 저장될 수 있지만 키는 중복 저장될 수 없다.
- 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.
- HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.
- 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를 사용하여도 된다.
출처
https://dev-coco.tistory.com/38
'이론 > 자바' 카테고리의 다른 글
[Java] Wrapper Class (0) | 2024.09.05 |
---|---|
[Java] TreeMap (0) | 2024.09.04 |
[Java]TreeSet (0) | 2024.09.04 |
[Java] HashSet (0) | 2024.09.04 |
[Java] 자바 컬렉션 프레임워크(List, Set, Map) (0) | 2024.09.04 |