목차

Collection framework; Map interface

🗓️

Map 인터페이스

  • Map은 key-value 쌍의 데이터로 표현된다.
  • Map 인터페이스를 구현한 클래스는 내부적으로 해시 알고리즘에 의해 구현되어 있다.

Map 주요 메소드

  • V put(K key, V value) : key에 해당하는 value를 Map에 삽입한다.
  • V get(K key) : key에 해당하는 value를 반환한다.
  • boolean isEmpty() : Map이 비어있는지 반환한다.
  • boolean containsKey(Object key) : Map에 해당 key가 있는지 반환한다.
  • boolean containsValue(Object value) Map에 해당 value가 있는지 반환한다.
  • Set keyset() : key집합을 Set으로 반환한다.
  • Collection values() : value를 Collection으로 반환한다.
  • V remove(key) : key가 있는 경우 삭제한다.
  • boolean remove(Object kay, Object value) : key가 있는 경우 key에 해당하는 value가 인자와 일치할때 삭제한다.

HashMap 클래스

  • 가장 많이 사용하는 Map인터페이스 구현체다.
  • 해시 방식의 자료를 저장하는 공간을 해시 테이블이라고 한다.
  • key값이 정해지면 그에 대응하는 해시 테이블의 저장위치가 저장되는데 이런 위치 계산 함수가 해시 함수다.
  • key를 알고 있는 상태에서 value를 검색하는데 상당히 빠르다.
  • 다른 key에 같은 index가 반환되는 collision이 발생할 수 있다. 그래서 적정수준으로 데이터가 차면 확장해 collision확률을 낮춘다.
  • Map인터페이스에서 사용하는 key값은 중복될 수 없다. 그래서 equals()hashCode()를 재정의한다.
  • 다음은 회원관리 프로그램을 HashMap으로 정의한 것이다
public class MemberHashMap {

    private HashMap<Integer, Member> hashMap;

    public MemberHashMap() {
        hashMap = new HashMap<Integer, Member>();
    }

    public void addMember(Member member) {
        hashMap.put(member.getMemberId(), member);
    }

    public boolean removeMember(int memberId) {
        if (hashMap.containsKey(memberId)) {
            hashMap.remove(memberId);
            return true;
        }
        System.out.println(memberId + "is not found");
        return false;
    }

    public void showAllMember() {
        Iterator<Integer> iterator = hashMap.keySet().iterator();
        while (iterator.hasNext()) {
            int key = iterator.next();
            Member member = hashMap.get(key);
            System.out.println(member);
        }
        System.out.println(" ");
    }

}
  • showAllMember()를 보면 Iterator로 순회하는것을 알 수 있다. Map 인터페이스는 모든 자료를 한번에 순회할 수 있는 기능이 없다. 그래서 Iterator로 순회하는 것이다.
  • key를 먼저 가져와서 그 key로 순회하면서 value를 가지고 온다.
  • 다음은 테스트코드다
public class MemberHashMapTest {

    public static void main(String[] args) {
        MemberHashMap memberHashMap = new MemberHashMap();

        Member member1 = new Member(1001, "아이유");
        Member member2 = new Member(1002, "이지은");
        Member member3 = new Member(1003, "이지금");
        Member member4 = new Member(1004, "이지동");

        memberHashMap.addMember(member1);
        memberHashMap.addMember(member2);
        memberHashMap.addMember(member3);
        memberHashMap.addMember(member4);

        memberHashMap.showAllMember();

        memberHashMap.removeMember(1004);
        memberHashMap.showAllMember();
    }

}

Hashtable

  • HashMap과 마찬가지로 k-v 구조다. Vector와 마찬가지로 멀티스레드를 위한 동기성을 제공한다.

TreeMap

  • Key값으로 자료를 정령하려면 TreeMap을 사용할 수 있다. TreeSet과 마찬가지로 이진 검색 트리로 구현되어있다.
  • 마찬가지로 Comparable이나 Comparator 인터페이스를 구현해야한다.
  • 소스는 동일해서 첨부하진 않겠다.