티스토리 뷰
HashMap - 순서X, 중복(키X, 값O)
- Map인터페이스를 구현. 데이터를 키와 값 쌍으로 저장
- HashMap(동기화X)은 HashTable(동기화O)의 신버젼
Map인터페이스를 구현. 데이터를 키와 값 쌍으로 저장
HashMap(동기화X)은 HashTable(동기화O)의 신버젼

HashMap과 TreeMap만 알고 있으면 된다. TreeMap은 TreeSet과 같은 특성을 갖는다. 이진 탐색 트리로 구현한 것이다. 키와 값의 쌍으로 저장한다는 특성을 제외하면 둘은 같다고 보면 된다.
HashMap
- Map인터페이스를 구현한 대표적인 컬렉션 클래스
- 순서를 유지하려면, LinkedHashMap클래스를 사용하면 된다.
TreeMap
- 범위 검색과 정렬에 유리한 컬렉션 클래스
- HashMap보다 데이터 추가, 삭제에 시간 더 걸림
HashMap의 키(key)와 값(value)
- 해싱(hashing)기법으로 데이터를 저장. 데이터가 많아도 검색이 빠르다.
- Map인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장
해싱(hashing)기법으로 데이터를 저장. 데이터가 많아도 검색이 빠르다.
클래스 이름으로 'Hash'가 붙는 건 다 해싱 기법을 사용한다. HashMap도 해싱기법을 이용하여 데이터를 저장한다.
Map인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장
- 키(key) : 컬렉션 내의 키(key) 중에서 유일해야 한다.
- 값(value) : 키(key)와 달리 데이터의 중복을 허용한다.
리스트(List)나 셋(Set)이 add메서드를 사용하는 것에 반해, 맵(Map)은 put메서드를 사용한다. 그리고 키(key)와 값(value)를 한 쌍으로 저장한다.
HashMap map = new HashMap();
map.put("myId", "1234");
map.put("asdf", "1111");
map.put("asdf", "1234");

3개의 데이터 쌍을 저장했지만 실제로는 2개 밖에 저장되지 않은 이유는 중복된 키가 있기 때문이다. 세 번째로 저장한 데이터의 키인 'asdf'는 이미 존재하기 때문에 새로 추가되는 대신 기존의 값을 덮어썼다. 그래서 키 'asdf'에 연결된 값은 '1234'가 된다.
즉, 똑같은 키(key)로 다른 값이 들어오면 에러가 나는 것이 아니고, 저장이 안 되는 것도 아니라, 이 값("1111")을 새로운 값("1234")으로 덮어쓴다.
Map은 값은 중복을 허용하지만 키는 중복을 허용하지 않기 때문에 저장하려는 두 데이터 중에서 어느 쪽을 키로 할 것인지를 잘 결정해야 한다.


key, value를 따로 객체 배열로 저장할 수 있지만, 이것 보다는 key, value를 하나로 묶은 다음에, 이 묶음을 배열로 선언하는 것이 보다 더 객체지향적인 코드이다.(old)
해싱(hashing) - (1/3)
- 해싱 : 해시함수(hash function)로 해시테이블(hash table)에 데이터를 저장, 검색
- 해시테이블 : 배열과 링크드리스트(LinkedList)가 조합된 형태
- 해시테이블에 저장된 데이터를 가져오는 과정
환자정보 관리
해싱 : 해시함수(hash function)로 해시테이블(hash table)에 데이터를 저장, 검색
- 해시함수 : 어떤 키값을 넣으면 배열의 저장위치(index)를 알려준다.
- 해시코드 : '저장위치(index)'
- 해싱 : (해시)함수를 이용해서 저장하고 읽어오기
해시테이블 : 배열과 링크드리스트(LinkedList)가 조합된 형태
해시테이블은 배열의 장점인 '접근성'과 링크드리스트(LinkedList)의 장점인 '변경에 유리'하다는 점을 조합한 것이다.
해시함수의 성능이 중요한데, 우리는 Objects.hash메서드를 이용해서 작성하면 된다. 해시를 사용하는 클래스는 Hashtable, HashMap, HashSet이 있다. 이 클래스들은 hashCode메서드를 사용하는데, 이 Objects.hash메서드를 오버라이딩하여 작성하면 된다.
해시테이블에 저장된 데이터를 가져오는 과정
- 키로 해시함수를 호출해서 해시코드를 얻는다.
- 해시코드(해시함수의 반환값)에 대응하는 링크드리스트를 배열에서 찾는다.
- 링크드리스트에서 키와 일치하는 데이터를 찾는다.
| 참고 | 해시함수는 같은 키에 대해서 항상 같은 해시코드를 반환해야 한다. 서로 다른 키일지라도 같은 값의 해시코드를 반환할 수도 있다.
HashMap의 주요 메서드
생성자

HashMap은 해시테이블에 데이터를 저장한다.
해시테이블 = 배열 + 링크드리스트
추가, 삭제

읽기

get, contain

기타

예제11-16
예제11-17
Collections.max() 와 Collections.min()의 매개변수로 Comparable을 구현한 클래스의 객체만 들어올 수 있다.
System.out.println("최고점수 : " + Collections.max(values));
System.out.println("최저점수 : " + Collections.min(values));
최대값, 최소값도 '비교기준'이 있어야 비교를 할 수 있기 때문이다.


앞에 static이 붙어있지 않지만 생략된 것이다. 인터페이스안에 선언된 내부 클래스나 인터페이스는 모두 static이 붙는다. 그래서 Map.Entry로 표현
예제11-18
'Java의 정석_기초편' 카테고리의 다른 글
지네릭스란 & 타입 변수 (0) | 2022.11.07 |
---|---|
Collections (0) | 2022.11.05 |
TreeSet (0) | 2022.11.04 |
HashSet (0) | 2022.11.03 |
Comparator와 Comparable (0) | 2022.11.03 |