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으로 정의한 것이다
javapublic 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를 가지고 온다.
- 다음은 테스트코드다
javapublic 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 인터페이스를 구현해야한다.
- 소스는 동일해서 첨부하진 않겠다.