[Java] 자바 컬렉션 - [Map] HashMap(java.util.HashMap)
컬렉션 클래스 : Map
- 값을 저장할 때 key 개체의 해시 값(hash value)을 사용하여 저장한다.
- 값을 꺼낼 때도 key 객체의 해시 값을 사용하여 꺼낸다.
- 값을 중복 저장할 수 없다.
- 순서대로 저장하고 순서대로 꺼낼 수 없다.
- 보통 문자열 라벨을 사용하여 값을 저장하고 꺼낼 때 주로 사용한다.
- 예)
HashMap :
- key나 value로 null을 허용한다.
- 동기화를 지원하지 않는다.
=> 여러 스레드가 동시에 접근하여 값을 변경하는 것을 막지 않는다.
=> 데이터의 입출력 속도가 빠르다.
=> 대신 여러 스레드가 동시에 값을 바꿀 수 있기 때문에
멀티 스레드 상황에서 사용할 때 주의해야 한다.
Hashtable :
- key나 value로 null을 허용하지 않는다.
- 동기화를 지원한다.
=> 여러 스레드가 동시에 접근하더라도 그 중 한개의 스레드만이 접근할 수 있다.
=> 데이터의 입출력 속도가 느리다.
=> 대신 여러 스레드가 동시에 값을 바꿀 수 없기 때문에
멀티 스레드 상황에서 안전하게 사용할 수 있다.
put(key, value)
- key 객체 :
1) key 객체의 hashCode() 리턴 값을 사용하여
value를 저장할 때 사용할 위치를 계산한다.
2) 그래서 key 객체는 같은 값을 가진 객체인 경우
같은 hashCode()를 리턴하는 클래스를 사용한다.
예) String, 랩퍼 클래스(Byte, Short, Integer, Long, Float, Double, Boolean 등)
- value 객체: Map 컬렉션에 보관될 값
Map에서 값을 꺼내는 방법 I
- 값을 저장할 때 사용한 key를 통해 꺼낸다.
- 반드시 같은 인스턴스일 필요는 없다.
저장할 때 사용한 key의 hashCode() 리턴 값과
같은 hash value를 가진다면 값을 꺼내는 key로 사용할 수 있다.
물론 equals()의 결과도 true여야 한다.
값을 저장할 BooK class 예제
static class Book {
String title;
String press;
int page;
public Book(String title, String press, int page) {
this.title = title;
this.press = press;
this.page = page;
}
public String toString() {
return String.format("%s, %s, %d", title, press, page);
}
}
Map에서 값을 꺼내는 호출 코드
public static void main(String[] args) {
HashMap map = new HashMap();
map.put(new String("key1"), new Book("aaaa", "유리출판사", 100));
map.put("key2", new Book("bbbb", "유리출판사", 200));
map.put(3, new Book("cccc", "유리출판사", 300));
System.out.println(map.get(new String("key1")));
System.out.println(map.get(3));
}
}
- 실행 결과 :
aaaa, 유리출판사, 100
cccc, 유리출판사, 300
* 참고 :
key 값에 올 수 있는 건 인스턴스 뿐인데 어째서 key 값으로 숫자 1을 넣어줄 수 있는 것인가?
=> 랩퍼 클래스(wrapper class)는 오토 박싱 (auto-boxing) 기능을 가지고
있어서 인스턴스를 요구하는 명령어가 있을 경우, key 값으로 써준 숫자 1을
자동적으로 new Integer(1)로 만들어 준다.
** 참고 :
map.get(key)메서드가 리턴하는 것은 key 값에 해당되는 인스턴스의
toString() 메서드 리턴 값이다.
Map에서 값을 꺼내는 방법 II
- 값 목록을 리턴 받아 꺼낸다.
Collection valueList = map.values();
// 값이 들어 있는 컬렉션에서 값을 한 개씩 꺼내줄 도구를 얻는다.
Iterator iterator = valueList.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
Map에서 값을 꺼내는 방법 III
- key 목록을 리턴 받아 꺼낸다
Set KeySet = map.KeySet();
Object[] keyArray = keySet.toArray();
for (int i = 0; i < keyArray.length; i++) {
System.out.println(map.get(keyArray[i]));
}
Map에서 값을 꺼내는 방법 V
- key와 value를 한쌍으로 하는 목록을 리턴 받는다.
Set entrySet = map.entrySet();
for (Object object : entrySet) {
Entry entry = (Entry)object;
System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
}