ㆍMap
- List, Set, Queue는 Collection 인터페이스를 구현하지만, Map은 Collection 인터페이스를 구현하지 않는다.
- Set의 자료구조는 키(Key), 값(Value)으로 이루어져 있으며, Key의 중복을 허용하지 않는다.(값이 중복되는 것은 전혀 상관없다.)
Map 인터페이스의 메소드
- put(K Key, V value) : 키, 값이 쌍을 이루는 데이터를 저장.
- putAll(Map<? extends K, ? extends V> m) : 매개 변수로 넘어온 Map의 모든 데이터 저장.
- get(Object Key) : 매개변수의 Key에 해당하는 값(Value)를 반환한다.
- remove(Object Key) : 매개변수로 넘어온 키와 값을 지운다. (값이 리턴됨.)
- keySet() : key의 목록을 Set 타입으로 리턴.
- values() : 값의 목록을 Collection 타입으로 리턴.
- Map 인터페이스를 구현한 클래스들 중 가장 유명하고 애용되는 것이 HashMap, TreeMap(데이터 추가와 동시에 정렬), LinkedHashMap 그리고 Hashtable 이다.
- HashMap = 키나 값에 null 저장 가능, 멀티 쓰레드에 안전하지 않음
- Hashtable = 키나 값에 null 저장 불가, 멀티 쓰레드에 안전함
- Hashtable 을 제외한 Map 클래스들을 여러 쓰레드에 동시에 접근하여 처리할 때 다음과 같이 선언해야함. (아니면 Concurrent 가 포함되어 있는 클래스 사용 ConcurrentHashMap, CopyOnWriteArrayList 등)
Map threadSafeMap = Collection.synchronizedMap(new HashMap(...));
ㆍHashMap
- Object -> AbstractMap<K, V> -> HashMap<K, V>
▶ HashMap의 상속관계
- Serializable, Cloneable, Map<E>
▶ HashMap이 구현한 인터페이스
HashMap 의 생성자
- HashMap() = 16개의 capacity, 0.75의 load factor을 갖는 HashMap 객체 생성.
- HashMap(int) = 매개변수만큼의 capacity를 갖는 HashMap 객체 생성.
- HashMap(int, float) = 첫 번째 매개변수의 Capacity, 두 번째 매개변수의 load factor를 갖는 HashMap 객체 생성.
- HashMap(Map) = 매개변수로 넘어온 Map을 구현한 객체의 데이터를 갖는 HashMap 객체 생성.
HashMap에서는 키(Key) 데이터 값을 int index = Key.hashCode() % capacity 연산을 통해 저장할 위치를 계산하고, 해당 위치에 값(value)을 저장한다.
만약, 기존에 존재하는 Key의 hashCode() 값과 새롭게 추가되는 Key의 hashCode() 값이 같다면, 해당 위치에서 LinkedList 형태로 데이터를 저장해버린다. 이후, Key에 해당하는 값을 불러오려고 할 때, 추가적인 equals() 메소드의 실행을 통해 Key를 찾게된다. (검색시간 증가)
따라서, 개발자가 만든 클래스를 Key로 사용할 때는 hashCode(), equals() 메소드를 잘 구현해놓아야 한다.
- HashMap의 저장공간을 버켓(bucket)이라고 한다. (목록 형태)
- HashMap<K key, V value> = Key의 자료형과 Value의 자료형을 지정해주는 것이 좋음.
- put(Key, Value) : HashMap 객체에 [키 값]으로 이루어진 데이터를 추가한다. (이미 존재하는 key값으로 데이터를 추가하면 기존의 데이터를 덮어씀)
HashMap<String, String> map = new HashMap<>();
map.put("A", "alpha");
- get(Key) : HashMap 객체에서 Key값에 해당하는 데이터를 리턴한다. (존재하지 않는 키를 get() 했을 때 null리턴)
HashMap<String, String> map = new HashMap<>();
map.put("A", "alpha");
System.out.println(map.get("A"));
// alpha 출력
- keySet() : key값의 목록을 Set형태로 반환.
public <T> void checkMap(HashMap<T, T> map) {
Set<T> set = map.keySet(); // key목록을 Set타입으로 저장.
Iterator<T> iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
- values() : 값(value)의 목록을 Collection형태로 반환.
public <T> void checkValues(HashMap<T, T> map) {
Collection<T> values = map.values(); // 값 value을 Collection 타입으로 저장.
for(T a : values) {
System.out.println(a);
}
}
- entrySet() : Map.Entry 타입의 객체로 리턴. 이 객체에서 getKey(), getValue() 메소드 사용 가능.
public <T> void checkHashMapEntry(HashMap<T, T> map) {
Set<Map.Entry<T, T>> entry = map.entrySet();
for (Map.Entry<T, T> tempEntry : entry) {
System.out.println(tempEntry.getKey() + "=" + tempEntry.getValue());
// Map.Entry 객체의 메소드를 이용하여 키, 값 출력
}
}
- containsKey(K key) : 매개변수로 받은 키의 존재 여부를 boolean으로 리턴.
- containsValue(V value) : 매개변수로 받은 값의 존재 여부를 boolean으로 리턴.
public <T> void checkContains(HashMap<T, T> map) {
System.out.println(map.containsKey("A"));
System.out.println(map.containsKey("Z"));
System.out.println(map.containsValue("alpha"));
System.out.println(map.containsValue("alp"));
}
- remove(K Key) : 매개변수로 받은 key의 해당하는 데이터를 삭제. (삭제된 데이터는 리턴 됨.)
ㆍTreeMap
- TreeMap은 데이터 추가와 동시에 정렬한다.
- 기본적인 정렬 순서 "숫자 > 알파벳대문자 > 알파벳소문자 > 한글"
- HashMap보다 느리다.
- SortedMap 인터페이스를 구현, firstKey(), lastKey(), higherKey(), lowerKey() 등의 메소드를 제공.
ㆍProperties
- 시스템의 속성을 가지는 객체.
- Hashtable 클래스를 확장함. (key, value로 값이 저장됨)
- System.getProperties() 메소드로 Properties 타입의 객체를 받을 수 있음.
- Properties 클래스에서 load(), loadFromXML(), store(), storeToXML()등의 파일 관련 메소드를 제공. (해당 메소드에서 String 매개변수로 주석 추가 가능)
참고
- 자바의 신 Vol.2 (이상민 저자)
- https://onsil-thegreenhouse.github.io/programming/java/2018/02/22/java_tutorial_HashMap_bucket/
[Java] HashMap의 element 저장 방식(bucket) - Onsil's blog
초짜 개발자 온실의<br> 스터디 블로그
onsil-thegreenhouse.github.io
- https://stackoverflow.com/questions/37959941/what-exactly-is-bucket-in-hashmap
What exactly is bucket in hashmap?
Recently, in an interview I was asked, what exactly is a bucket in hashmap? Whether it is an array or a arraylist or what? I got confused. I know hashmaps are backed by arrays. So can I say that ...
stackoverflow.com