공부/Java

[Java-11] 컬렉션 프레임웍 - HashMap, TreeMap, Properties, Collections

줭♪(´▽`) 2021. 6. 7. 18:43

1. HashMap

1) HashMap이란?

- Hashtable의 새로운 버전

- Hashtable보다는 HashMap을 사용할 것을 권함

 

- HashMap은 Map을 구현했으므로 Map의 특징을 이어받음

(1) 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로 저장함

(2) 순서를 유지하지 않음

(3) 키는 중복을 허용하지 않고, 값은 중복을 허용함

 

- 추가로 해싱(hashing)을 사용하여 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보임

 

- 키(key)는 주로 String을 대문자 또는 소문자로 통일해서 사용함

- 키(key)는 저장된 값을 찾는데 사용되므로 컬렉션 내에서 유일(unique)해야 함

  = 하나의 키로 검색했을 때 결과가 단 하나여야 함

 

2) 생성자

 

HashMap() HashMap객체 생성
HashMap(int initialCapacity) 지정된 값을 초기용량으로 하는 HashMap객체 생성
HashMap(int initialCapacity, float loadFactor) 지정된 초기용량과 load factor의 HashMap객체 생성
HashMap(Map m) 지정된 Map의 모든 요소를 포함하는 HashMap객체 생성

 

3) 데이터 추가

 

Object put(Object key, Object value) 지정된 키와 값을 HashMap에 저장
void putAll(Map m) Map에 저장된 모든 요소를 HashMap에 저장

 

4) 데이터 삭제

 

Object remove(Object key) HashMap에서 지정된 키로 저장된 값(객체) 제거
void clear() HashMap에 저장된 모든 객체 제거

 

5) 값 가져오기

 

Set entrySet() HashMap에 저장된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set에 저장해서 반환
Set keySet() HashMap에 저장된 모든 키가 저장된 Set을 반환
Object get(Object key) 지정된 키(key)의 값(객체)을 반환, 못찾으면 null 반환
Object getOrDefault(Object key, Object defaultValue) 지정된 키(key)의 값(객체)을 반환, 키를 못찾으면 기본 값(defaultValue)에 지정된 객체를 반환
Collection values() HashMap에 저장된 모든 값을 컬렉션의 형태로 반환

 

6) 기타

 

Object clone() 현재 HashMap을 복제해서 반환
boolean containsKey(Object key) HashMap에 지정된 키(key)가 포함되어있는지 알려줌
boolean containsValue(Object value) HashMap에 지정된 값(value)이 포함되어있는지 알려줌
boolean isEmpty() HashMap이 비어있는지 알려줌
Object replace(Object key, Object value) 지정된 키와 값을 지정된 객체(value)로 대체
boolean replace(Object key, Object oldValue, Object newValue) 지정된 키와 객체(oldValue)가 모두 일치하는 경우에만 새로운 객체(newValue)로 대체
int size() HashMap에 저장된 요소의 개수를 반환

 

해싱과 해시함수

- 해싱 : 해시함수(hash function)을 이용해서 데이터를 해시테이블(hash table)에 저장하고 검색하는 기법
- 해시함수는 데이터가 저장되어 있는 곳을 알려 주기 때문에 원하는 데이터를 빠르게 찾을 수 있음
- 해싱을 구현한 컬렉션 클래스 : HashSet, HashMap, Hashtable
- 배열과 링크드 리스트의 조합으로 이루어짐

배열과 링크드 리스트의 조합으로 이루어짐

 


- 구현 과정
① 저장할 데이터의 키를 해시함수에 넣음
② 해시함수로부터 배열의 한 요소를 얻게 됨
③ 그 곳에 연결되어 있는 링크드 리스트에 저장

배열의 인덱스가 n인 요소의 주소 = 배열의 시작주소 + type의 size * n

 

 

 

2. TreeMap

1) TreeMap이란?

- 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장하는 컬렉션 클래스

- 검색과 정렬에 적합

 

HashMap vs TreeMap

검색 성능   HashMap > TreeMap
범위검색, 정렬 성능   HashMap < TreeMap

 

 

2) 생성자

 

TreeMap() TreeMap객체 생성
TreeMap(Comparator c) 지정된 Comparator를 기준으로 정렬하는 TreeMap객체 생성
TreeMap(Map m) 주어진 Map에 저장된 모든 요소를 포함하는 TreeMap객체 생성
TreeMap(SortedMap m) 주어진 SortedMap에 저장된 모든 요소를 포함하는 TreeMap객체 생성

 

 

이하 메소드는 생략 -> https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html

 

 

 

3. Properties

1) Properties란?

- HashMap의 구버전인 Hashtable을 상속받아 구현한 것

- 키와 값을 (Object, Object)가 아닌 (String, String)의 형태로 저장하는 보다 단순화된 컬렉션 클래스

- 주로 애플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용

 

2) 생성자

 

Properties() Properties 객체 생성
Properties(Properties defaults) 지정된 Properties에 저장된 목록을 가진 Properties객체 생성

 

3) 메소드

 

String getProperty(String key) 지정된 키의 값을 반환
String getProperty(String key, String defaultValue) 지정된 키의 값을 반환, 키를 못찾으면 defaultValue 반환
void list(PrintStream out) 지정된 PrintStream에 저장된 목록 출력
void list(PrintWriter out) 지정된 PrintWriter 에 저장된 목록 출력
void load(InputStream inStream) 지정된 InputStream으로부터 목록을 읽어서 저장
void load(Reader reader) 지정된 Reader로부터 목록을 읽어서 저장
void loadFromXML(InputStream in) 지정된 InputStream으로부터 XML문서를 읽어서 XML문서에 저장된 목록을 읽어다 담음
Enumeration propertyNames() 목록의 모든 키가 담긴 Enumeration 반환
Object setProperty(String key, String value) 지정된 키와 값을 저장, 이미 존재하는 경우 새로운 값으로 바꿈
void store(OutputStream out, String comments) 저장된 목록을 지정된 OutputStream에 출력(comments는 주석으로 저장됨)
void store(Writer writer, String comments) 저장된 목록을 지정된 Writer에 출력
void storeToXML(OutputStream os, String comment) 저장된 목록을 지정된 출력스트림에 XML문서로 출력(저장)
void storeToXML(OuputStream os, String comment, String encoding) 저장된 목록을 지정된 출력스트림에 해당 인코딩의 XML문서로 출력(저장)
Set stringPropertyNames() Properties에 저장되어 있는 모든 키를 Set에 담아서 반환

 

 

 

4. Collections

1) 컬렉션의 동기화

- 멀티 쓰레드 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에 동기화(synchronization)가 필요함

- Vector, Hashtable 같은 구버전 클래스들은 자체적으로 동기화 처리 기능 -> 성능 떨어뜨림

- 이후 버전 클래스들은 필요한 경우에만 java.util.Collections클래스의 동기화 메서드를 이용하여 동기화처리가 가능하도록 변경함

 

 

static Collection synchronizedCollection(Collection c)
static List synchronizedList(List list)
static Set synchronizedSet(Set s)
static Map synchronizedMap(Map m)
static SortedSet synchronizedSortedSet(SortedSet s)
static SortedMap synchronizedSortedMap(SortedMap m)

 

ex) List syncList = Collections.synchronizedList(new ArrayList(...));

 

2) 변경불가 컬렉션 만들기

- 변경 불가능한 읽기전용 컬렉션을 만들 수 있음

 

static Collection unmodifiableCollection(Collection c)
static List unmodifiableList(List list)
static Set unmodifiableSet(Set s)
static Map unmodifiableMap(Map m)
static NavigableSet unmodifiableNavigableSet(NavigableSet s)
static SortedSet unmodifiableSortedSet(SortedSet s)
static NavigableMap unmodifiableNavigableMap(NavigableMap m)
static SortedMap unmodifiableSortedMap(SortedMap m)

 

 

3) 싱글톤 컬렉션 만들기

- 하나의 객체만을 저장하는 컬렉션을 만들 수 있음

 

static List singletonList(Object o)
static Set singleton(Object o)   // singletonSet이 아님!
static Map singletonMap(Object key, Object value)

 

 

4) 한 종류의 객체만 저장하는 컬렉션 만들기

- 지정된 종류의 객체만 저장하는 컬렉션을 만들 수 있음

 

static Collection checkedCollection(Collection c, Class type)
static List checkedList(List list, Class type)
static Set checkedSet(Set s, Class type)
static Map checkedMap(Map m, Class keyType, Class valueType)
static Queue checkedQueue(Queue queue, Class type)
static NavigableSet checkedNavigableSet(NavigableSet s, Class type)
static SortedSet checkedSortedSet(SortedSet s, Class type)
static NavigableMap checkedNavigableMap(NavigableMap m, Class keyType, Class valueType)
static SortedMap checkedSortedMap(SortedMap m, Class keyType, Class valueType)

 

 

 

 

 

 

참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)