본문 바로가기

코딩/JAVA 공부

[JAVA] 자바의 정석 _ HashMap & Hashtable, Collections

 * HashMap & Hashtable - 순서 X 중복(키 X, 값 O)

- Map 인터페이스 구현, 데이터를 키와 값의 쌍으로 저장

- 순서를 유지하려면, LinkedHashMap 클래스 사용.

Hashtable의 신버전 = HashMap (각각 동기화 O, 동기화 X)

- 해싱(hashing)기법으로 데이터를 저장, 데이터가 많아도 검색이 빠름.

해싱: 해시함수를 이용해 해시테이블에 데이터를 저장 & 읽어오는 것.

해시 함수 : hashCode() 를 사용해 만드는데, Objects.hash()를 통해 hashCode()를 오버라이딩 하면 됨.

- key, value 값 한 쌍 = Entry

Hashtable = 배열 + LinkedList

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable{
    transient Entry[] table; //Entry 를 저장하는 배열이 있음.
    ...
    static class Entry implements map.Entry{ // key와 value를 Entry로 묶어 저장.
    	final Object key;
        Object value;
    }
}

1. 생성자 - HashMap(), HashMap(int initialCapacity), HashMap(int initialCapacity, float loadFactor), HashMap(Map m)

2. 추가 - Object put (Object key, Object value), void putAll (Map m)

3. 삭제 - Object remove (Object key)

4. 변경 - Object replace (Object key, Object value)

              boolean replace (Object key, Object oldValue, Object newValue)

5. 읽기 - Set entrySet()

            - Set keySet()

            - Collection values()

            - Object get (Object key) : key값에 연결된 value값 리턴

            - Object getOrDefault (Object key, Object defaultValue) : ket 가 있으면 value를, 없으면 defaultValue를 반환

6. 확인 - boolean containsKey (Object key)

            - boolean containsValue (Object value)

Entry 사용해 key, value값 가져오기

HashMap map = new HashMap();
map.put("김자바", 90);
map.put("김자바", 100);
map.put("이자바", 90);
map.put("강자바", 80);
map.put("박자바", 90);

Set set = map.entrySet();
Iterator it = set.iterator();

while(it.hasNext()){
    Map.Entry e = (Map.Entry)it.next();
    System.out.println("이름 :" +e.getKey() " ", 점수 :"+e.getValue());
}

  TreeMap

- 이진 탐색 트리, 범위 검색과 정렬에 유리

- 데이터 추가 삭제에 시간이 더 걸림.

 

 * Collections

- 컬렉션을 위한 static 메서드 제공 (Objects, Arrays 도 비슷한 계열의 클래스)

1. 컬렉션 채우기, 복사, 정렬, 검색 - fill(), copy(), sort(), binarySearch()

2. 컬렉션의 동기화 - synchronizedXXX()

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

3. 변경 불가(read Only) 컬렉션 만들기 - unmodifiableXXX()

4. 싱글톤 컬렉션 만들기 -singletonXXX() : 객체 1개만 저장

5. 한 종류의 객체만 저장하는 컬렉션 만들기 - checkedXXX()

List checkedList = checkedList(list, String.class); // String만 저장 가능