[Java]::Remind - Collection (Map) - 2 -

Gentlee's Self-Study Log·2023년 5월 12일
0

Java Reminder

목록 보기
10/19
post-thumbnail

Java Collection Framework

Java에서 배열에 비효율적인 문제 중 하나는 크기가 고정적이라는 것이다. 배열의 크기는 생성될 때, 크기가 정해지고 정해진 크기 이상으로 데이터를 저장할 수 없기 때문에 문제가 발생합니다. 이를 해결하기 위해 자바에서는 객체와 데이터들을 효율적으로 관리할 수 있는 자료구조를 라이브러리로 제공하는데 이것이 Collection Framework이다.


(출처-https://coding-factory.tistory.com/550)

Map Collection

Map 컬렉션은 key(키)와 value(값)으로 구성되어 있는 객체를 저장하는 자료구조이다. 키는 중복되지 않는 데이터로 저장할 수 있고, 값은 중복되어 저장할 수 있다. Map은 리스트와 배열처럼 순차적으로 해당 요소 값을 구하는 것이 아닌, key를 통해서 value값을 구한다. 인덱스로 관리하는것이 아닌 key로 자료를 관리한다.

Map.Entry라는 객체로 저장된다.

흔히 Map Collection에는 대표적으로 세가지가 있다.

  • HashMap
  • TreeMap
  • Hashtable

HashMap

HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있습니다.

Map은 키와 값으로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조이기 때문에 키와 값은 모두 객체입니다. 값은 중복 저장될 수 있지만 키는 중복 저장될 수 없다.

만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체된다.

HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.

HashMap은 저장공간보다 추가로 데이터를 저장할 때, List처럼 한칸씩 늘어나는것이 아닌 약 두배로 저장공간을 늘리기 때문에 과부하가 많이 올 수 있다.

HashMap - 생성자

HashMap<String,String> map1 = new HashMap<String,String>();
//HashMap생성

HashMap<String,String> map2 = new HashMap<>();
'//new에서 타입 파라미터 생략가능

HashMap<String,String> map3 = new HashMap<>(map1);
//map1의 모든 값을 가진 HashMap생성

HashMap<String,String> map4 = new HashMap<>(10);
//초기 용량(capacity)지정

HashMap<String,String> map5 = new HashMap<>(10, 0.7f);
//초기 capacity,load factor지정

HashMap<String,String> map6 = new HashMap<String,String>(){{            
    put("a","b");  //초기값 지정
}};

HashMap - 메소드

put(key, value) : key와 value 저장
remove(key) : key값인 데이터 삭제
clear() : 모든 값 삭제
get(key) : key값의 value를 출력
replace(key1, value2) : 키값이 key1인 값의 value값을 value2로 바꾼다.
containsKey(key) : 키값이 key인 객체가 존재 유무
containsValue(value) : value값이 value인 존재 유무

entrySet() : key값과 value값 둘다 출력할 때

for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("[Key]:" + entry.getKey() + 
    " [Value]:" + entry.getValue());
}

keySet() : key값만 출력할 때

for(Integer i : map.keySet()){ 
//저장된 key값 확인
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}

HashMap-Iterator

반복문을 사용안하고 iterator를 사용할 수도 있다.

//entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Map.Entry<Integer, String> entry = entries.next();
    System.out.println("[Key]:" + entry.getKey() + 
    " [Value]:" +  entry.getValue());
}

		
//keySet().iterator()
Iterator<Integer> keys = map.keySet().iterator();
while(keys.hasNext()){
    int key = keys.next();
    System.out.println("[Key]:" + key + " [Value]:" +  map.get(key));
}

TreeMap

TreeMap은 이진트리를 기반으로 한 Map컬렉션이다. TreeMap에 데이터를 저장하면 자동으로 정렬되는데, 키는 오름차순으로 정렬된다. 숫자 타입인 경우에는 값으로, 문자열 타입인 경우에는 유니코드로 정렬한다.

정렬 과정은 기본적으로 부모 키값과 비교해서 키값이 낮은 것은 왼쪽 자식 노드로, 높은 것은 오른쪽 자식 노드에 Map.Entry객체가 저장된다.

TreeMap은 데이터를 저장할 때, 즉시 정렬하기에 추가나 삭제가 HashMap과 비교해서 오래걸리기 때문에 Map으로서 성능이 HaspMap보다 떨어진다. 하지만 정렬된 상태로 Map을 유지하거나, 정렬된 데이터를 조회/검색 할때는 HashMap보다 성능이 좋다.

TreeMap - 생성자

생성하는 명령어는 HashMap과 크게 다르지 않지만, 선언 시에 크기를 지정할 수는 없다.

TreeMap<Integer,String> map1 = new TreeMap<Integer,String>();
//TreeMap생성

TreeMap<Integer,String> map2 = new TreeMap<>();
//new에서 타입 파라미터 생략가능

TreeMap<Integer,String> map3 = new TreeMap<>(map1);
//map1의 모든 값을 가진 TreeMap생성

TreeMap<Integer,String> map6 = new TreeMap<Integer,String>(){{
//초기값 설정
    put(1,"a");
}};

TreeMap - 메소드

put(key, value) : key와 value 저장
remove(key) : key값인 데이터 삭제
clear() : 모든 값 삭제
get(key) : key값의 value를 출력

  • TreeMap은 HashMap과 다르게 항상 정렬되어 있는 Tree구조이기 때문에 최솟값과 최댓값을 가져오는 메소드도 있다.

firstEntry() : 최소 Entry 출력
firstKey() : 최소 Key 출력
lastEntry() : 최대 Entry 출력
lastKey() : 최대 Key 출력

entrySet() : key값과 value값 둘다 출력할 때

for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("[Key]:" + entry.getKey() +
    " [Value]:" + entry.getValue());
}

keySet() : key값만 출력할 때

for(Integer i : map.keySet()){ 
//저장된 key값 확인
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}

TreeMap - Iterator

//entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Map.Entry<Integer, String> entry = entries.next();
    System.out.println("[Key]:" + entry.getKey() + 
    " [Value]:" +  entry.getValue());
}

		
//keySet().iterator()
Iterator<Integer> keys = map.keySet().iterator();
while(keys.hasNext()){
    int key = keys.next();
    System.out.println("[Key]:" + key + " [Value]:" +  map.get(key));
}

Hashtable

HashMap과 거의 동일한 기능을 한다.
차이점 :

  • null키와 null값을 저장할 수 없다.
  • 동기화 처리가 되어 있다.

Hashtable - 메소드

keySet() : 키값들만 출력
values() : 값들만 출력

profile
https://github.com/SamGentlee

0개의 댓글