Collections - Map(HashMap, TreeMap, Properties)

apayaya·2022년 8월 3일
0

Map

  • interface
  • Key Value로 구성된 Entry객체를 저장하는 구조
  • Key는 중복값 불가능, Value는 중복값 가능
  • 구현 클래스 : Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap, Properties

Map.Entry

  • interface Map.Entry<K,V>
  • Map에 저장된 하나의 K,V 쌍
  • entry.getKey() -> K
  • entry.getValue() -> V

methods

  • put(K,V) -> V : 기존에 K로 저장된 값 있으면 반환
  • putAll(Map) -> void
  • get(K) -> V : 키로 값 검색, 없으면 null
  • getOrDefault(K,V) -> V : 키로 값을 검색, 없으면 리턴할 기본값 지정
  • containsKey(K) -> boolean : 키 존재 여부
  • containsValue(V) -> boolean : 값 존재
  • entrySet() -> Set<Map.Entry<K,V>> : 저정된 모든 키값 쌍을 Map.Entry 객체로 담고 있는 Set 반환
  • keySet() -> Set<K>
  • values() -> Collection<V>
  • size() -> int : 요소 개수

lambda를 받는 함수

  • compute(K key, BiFunction<K,V,V> func) -> V
  • computeIfAbsent(K key, Function<K,V> f) -> V
  • computeIfPresent(K key, BiFunction<K,V,V> f) -> V
  • merge(K key, V value, BiFunction<V,V,V> f) -> V
  • forEach(BiConsumer<K,V> action) -> void
  • replaceAll(BiFunction<K,V,V> f) -> void
// key에 대응되는 value에 대하여 value값을 처리
// 없는 키는 에러, 새로 저장된값 반환
map.compute("banana", (k, v) -> v + 1); // 바나나 1개 증가

// 키가 없으면 삽입, 있으면 그냥 종료
map.computeIfAbsent("banana", k-> 10);

// 키가 있으면 새로운 값으로 삽입
map.computeIfPresent("banana",(k,v) -> v*10);

// key가 새로운 경우, value 저장, 이미존재하는 경우, BiFunction결과값 저장
map.merge("banana",10,(oldVal,newVal)-> {
    System.out.println(oldVal);
    System.out.println(newVal);
    return oldVal+newVal;
});


// list, set 과 다르게 매개변수가 2개인 Consumer
map.forEach((k,v)->{});

// 모든 요소의 value에 대해, 함수적용한 결과를 저장
map.replaceAll((key,value)->{
    return value*2;
});

반복문

  • keySet() 메서드로 가져온 key들로 get(K) 메서드 호출해 요소 가져오기
  • entrySet() 메서드로 모든 Map.Entry 가져와서 getKey(), getValue() 메서드 호출하기

V 타입으로 Collection 사용하기

Map<String,List<Integer>> map = new HashMap();

if(map.containsKey(str)==false){
	List<Integer> list = new ArrayList();
	map.put(str,list);
}

HashMap

  • key로는 주로 "대문자" 혹은 "소문자" 로만 구성된 문자열을 이용

constructor

  • HashMap()
  • HashMap(int capacity, float loadFactor)

methods

삭제

  • clear() -> void : 모든 객체 제거
  • remove(Object key) -> Object : key가 일치하는 Entry 제거하고, 제거된 value 반환

검사, 조회

  • containsKey(Object key) -> boolean : key 존재여부
  • containsValue(Object value ) -> boolean : value 존재여부
  • isEmpty() -> boolean
  • size()-> int
  • get(Object key) -> Object : key에 해당하는 value, 없으면 null
  • getOrDefault(Object key, Object default) -> Object : 없으면 default

변환

  • entrySet() -> Set<Map.Entry<K,V>> : HashMap에 저장된 키 + 값을 Entry 형태로 반환
  • keySet() -> Set<K> : Key가 저장된 Set 반환, 중복 없음
  • values() -> Collection : value만 Collection에 담아서 반환, 중복가능

삽입

  • put(Object key, Object value) -> Object : 키와 값을 저장, 이미 존재하면 덮어써짐, 이전값 반환
  • putAll(Map m) -> void : Map 에 저장된 모든요소를 저장

변경

  • replace(Object key, Object value) -> Object : key에 해당하는값 존재하면, 새로운 값으로 대체, 이전값 반환
  • replace(Object key, Object oldval, Object newval) -> boolean : 키-값이 같으면 새로운값 저장

복사

  • clone() -> Object // HashMap을 복제

lambda를 받는 메서드

  • compute(K key, BiFunction<? super K,? super V,? extends V> mapper) -> V
  • computeIfAbsent(K,Function<K,V> mapper) -> V : key가 존재하지 않는 경우 추가
  • computeIfPresent(K,BiFunction<K,V,V> remapper) -> V
  • merge(K,V,BiFunction<V,V,V>) -> V
HashMap<String,Integer> map = new HashMap<>();
map.put("Java",1);
map.put("JavaScript",2);
map.put("Python",3);

map.computeIfPresent("Java",(String k,Integer v)->++v);

TreeMap

  • Tree구조로 구현되어 정렬과 검색기능 강화
  • Map.Entry가 key 값을 기준으로 정렬

Entry

  • class Entry<K,V> implements Map.Entry<K,V>
  • TreeMap에서 하나의 Node를 나타내기 위해 사용
static final class Entry<K,V> implements Map.Entry<K,V> {
	K key;
    V value;
    Entry<K,V> left;
    Entry<K,V> right;
    Entry<K,V> parent;
    boolean color = BLACK;
}

methods

  • firstEntry() -> Map.Entry<K,V> : 가장 작은 key값의 Entry
  • lastEntry() -> Map.Entry<K,V> : 가장 큰 key 값의 Entry
  • pollFirstEntry() -> Map.Entry<K,V> : key값 가정 작은 엔트리 삭제하고, 가져오기
  • pollLastEntry() -> Map.Entry<K,V> : key값 가장큰 엔트리 삭제하고, 가져오기
  • ceilingEntry(k) -> Map.Entry<K,V> : k와 같거나, 큰 키중 가장 작은키의 Entry
  • floorEntry(k) -> Map.Entry<K,V> : k와 같거나, 더 작은 키중 가장 큰키의 Entry
  • lowerEntry(K) -> Map.Entry<K,V>
  • higherEntry(K) -> Map.Entry<K,V>
  • ceilingKey(K) -> K
  • descendingKeySet() -> NavigableSet<K>
  • descendingMap() -> NavigableMap<K,V>
  • headMap(K toKey, boolean inclusive) -> NavigableMap<K,V> : smallest ~ toKey 까지 정렬
  • tailMap(K fromKey, boolean inclusive) -> NavigableMap<K,V> : fromKey ~ largest 까지 정렬
  • subMap(K fromKey, boolean, K toKey, boolean) -> NavigableMap<K,V>
  • .descendingMap() : 역순으로

Hashtable

  • thread-safe

Properties

  • .properties 확장자 파일 나타내는 class
  • Hashtable 의 하위 클래스

methods

  • load(FileReader fr) : properties 파일의 filereader 객체를 전달해 파일 로딩
  • get(String key) -> Object : 값을 Object 타입으로 리턴하므로 강제 타입변환 필요
  • getProperty(String key) -> String : 값을 String 타입으로
// 객체 생성하기
Properties pro = new Properties();
// loading
pro.load(new FileReader("path/to/application.properties"));
profile
java 정리

0개의 댓글