키(key) 컬렉션 내의 키(key)중에서 유일
값(value) 키(key)와 달리 데이터 중복을 허용
아래는 Map을 사용한 예제이다.
Map<String, Integer> map = new HashMap<>();
map.put("춘식이", 100);
map.put("라이언", 80);
map.put("짱구", 60);
map.put("호빵맨", 77);
Set<Map.Entry<String, Integer>> set = map.entrySet();
for (Map.Entry<String, Integer> entry : set) {
System.out.println("이름: " + entry.getKey() + ", 점수: " + entry.getValue());
}
Set<String> keySet = map.keySet();
System.out.println("이름 목록: " + keySet);
Collection<Integer> values = map.values();
System.out.println("최댓값: " + Collections.max(values));
System.out.println("최솟값 : " + Collections.min(values));
이름: 호빵맨, 점수: 77
이름: 짱구, 점수: 60
이름: 춘식이, 점수: 100
이름: 라이언, 점수: 80
이름 목록: [호빵맨, 짱구, 춘식이, 라이언]
최댓값: 100
최솟값 : 60
entrySet()
: HashMap에 저장된 키와 값을 엔트리의 형태로 Set에 저장해서 반환 keySet()
: HashMap에 저장된 모든 키가 저장된 Set을 반환 values()
: HashMap에 저장된 모든 값을 컬렉션의 형태로 반환 해싱?
해시함수(hash function)을 이용해서 데이터를 해시테이블(hash table)에 저장하고 검색하는 기법을 말한다.
자바에서 해싱을 구현한 컬렉션 클래스는 HashSet, HashMap 등이 있다.
해싱을 구현하는 과정에서 제일 중요한 것은 해시함수의 알고리즘 이다.
해싱을 구현한 컬렉션 클래스에서는 Object클래스에 정의된 hashCode()를 해시함수로 사용한다.
Object 클래스에 정의된 hashCode()는 객체의 주소를 이용하는 알고리즘으로 해시코드를 만들기 때문에
모든 객체에 대해 hashCode()를 호출한 결과가 유일하다.
String 클래스는 Object로부터 상속받은 hashCode()를 오버라이딩해서 문자열의 내용으로 해시코드를 생성한다.
그래서 서로 다른 String 인스턴스일지라도 같은 내용의 문자열이라면 hashCode() 호출 시 같은 해시코드를 얻는다.
서로 다른 두 객체에 대해 equals()로 비교한 결과가 true인 동시에 hashCode()의 반환값이 같아야 같은 객체로 인식한다.
따라서 새로운 클래스를 정의할 때 equals()를 오버라이딩 해야 한다면, hashCode()도 같이 오버라이딩해서
equals() 결과가 true인 두 객체의 hashCode() 결과도 같에 만들어야 한다.
그렇지 않으면, HashMap과 같이 해싱을 구현한 컬렉션 클래스에서 equals() 를 호출한 결과가 같은 객체일지라도
서로 다른 해시코드를 가지고 있으면 서로 다른 것으로 인식하고 다른 위치에 저장이된다.
해싱/해시테이블/충돌 에 대한 자세한 내용은 자료구조-해시테이블 포스팅을 참조