[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 예제
Map에서 값을 꺼내는 호출 코드
public static void main(String[] args) {
- 실행 결과 :
aaaa, 유리출판사, 100
cccc, 유리출판사, 300
* 참고 :
key 값에 올 수 있는 건 인스턴스 뿐인데 어째서 key 값으로 숫자 1을 넣어줄 수 있는 것인가?
=> 랩퍼 클래스(wrapper class)는 오토 박싱 (auto-boxing) 기능을 가지고
있어서 인스턴스를 요구하는 명령어가 있을 경우, key 값으로 써준 숫자 1을
자동적으로 new Integer(1)로 만들어 준다.
** 참고 :
map.get(key)메서드가 리턴하는 것은 key 값에 해당되는 인스턴스의
toString() 메서드 리턴 값이다.
Map에서 값을 꺼내는 방법 II
- 값 목록을 리턴 받아 꺼낸다.
Map에서 값을 꺼내는 방법 III
- key 목록을 리턴 받아 꺼낸다
}
Map에서 값을 꺼내는 방법 V
- key와 value를 한쌍으로 하는 목록을 리턴 받는다.
}
'Programming > java' 카테고리의 다른 글
[Java] 자바 (1) 예외처리 - 조건문 사용과 그 문제점 (0) | 2017.05.17 |
---|---|
[Java] 자바 제네릭 (Generic) 문법 (0) | 2017.05.17 |
[Java] 컬렉션 클래스 - [Set] HashSet (java.util.Hashset) (0) | 2017.05.16 |
[Java] 캡슐화(encapsulation), 접근 제어자(private, default, protected, public) (0) | 2017.05.15 |
[Java] super 키워드의 사용 (0) | 2017.05.15 |