HashMap, HashTable, LinkedHashMap, Properties, TreeMap이 있음
//ex)
Key:Value (Key = Value)
“name” : ”홍길동”
“address” : “서울시 중구”
“name” : ”고길동”
“address” : “서울시 강북구”
map은 출석부와 비슷하다, 같은 반에 동명이인(value)은 있어도 같은 번호(key)일 수 없다.

keySet() Iterator를 통해 접근entrySet()Iterator를 통해 접근Enumeration, Iterator, ListIterator
- 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스
- Enumeration : Iterator의 구버전
- ListIterator : Iterator를 상속받아 양방향 특징
- 상속구조 때문에 iterator() 메소드는 List와 Set 계열에서만 사용
🡪 Map의 경우 Set 또는 List화 시켜서 iterator()를 사용해야 함
- 주요 메소드
//ex)
Map<K, V> map = new HashMap<K, V>();
//ex)
Map<K, V> map = new HashTable<K, V>();

트리 : 각 노드 간 연결된 모양이 나무와 같다고 해서 붙여진 이름


//ex)
TreeSet<E> tSet = new TreeSet(Comparator<? super E> comparator);
TreeMap<K, V> tMap = new TreeMap(Comparator<? super K> comparator);public class MapService {
// Map : key와 Value 한 쌍이 데이터가 되어 이를 모아둔 객체
// - Key를 모아두면 Set의 특징(중복 X)
// - Value를 모아두면 List의 특징(중복 O)
public void ex1() {
// HashMap<K,V> : Map의 자식 클래스 중 가장 대표되는 Map
Map<Integer, String> map = new HashMap<Integer, String>();
// Map.put(Integer Key, Sting Value) : 추가(put)
map.put(1, "홍길동");
map.put(2, "고길동");
map.put(3, "김길동");
map.put(4, "이길동");
map.put(5, "박길동");
map.put(6, "최길동");
//Key 중복
map.put(1, "홍홍홍"); // 중복 허용 X, 대신 value를 덮어씀
//Value 중복
map.put(7, "최길동");
System.out.println(map); // map.toString() 오버라이딩 되어있음.
}
public void ex2() {
// Map 사용 예제
// Vo(값 저장용 객체)는 특정 데이터 묶음의 재사용이 많은 경우 주로 사용
// -> 재사용이 적은 VO는 오히려 코드 낭비
// -> Map을 이용해서 VO와 비슷한 코드를 작성할 수 있다!
// 1) VO버전
Member mem = new Member();
// 값 세팅
mem.setId("userId");
mem.setPw("userPw");
mem.setAge(30);
// 값 출력
System.out.println( mem.getId());
System.out.println( mem.getPw());
System.out.println( mem.getAge());
System.out.println("======================================");
// 2) Map버전
Map<String, Object> map = new HashMap<String, Object>();
// value가 Object 타입 == 어떤 객체든 Value에 들어올 수 있다!
// 값 세팅
map.put("id", "user02");
map.put("pw", "pass02");
map.put("age", 25); // int -> Integer(AutoBoxing)
// 값 출력
System.out.println(map.get("id").toString());
// String java.lang.Object.toString() -> 정적 바인딩
// 실행 중 확인해보니 String 자식 객체 -> 자식 toSting() 호출
// -> 동적 바인딩
System.out.println(map.get("pw"));
System.out.println(map.get("age"));
System.out.println("=====================================");
//*** Map에 저장된 데이터 순차적으로 접근하기 ***
// Map에서 Key만 모아두면 Set의 특징
// -> 이를 활용할 수 있도록 Map에서 keySet() 메서드 제공
// --> Key만 모아서 Set으로 반환
Set<String> set = map.keySet(); // id, pw, age 가 저장된 set을 반환
System.out.println(set);
// 향상된 for문
for(String key : set) {
System.out.println(map.get(key));
// key가 반복될 때 마다 변경
// -> 변경된 key에 맞는 map의 value가 출력
}
// map에 저장된 데이터가 많을 때,
// 어떤 key가 있는지 불분명 할 때,
// map에 저장된 모든 데이터에 접근 해야할 때
// keySet() + 향상된 for문 코드를 사용한다.
}
public void ex3() {
// List + Map
// user 10명 , user의 id 쭉뽑는다
// k : v
// "id" : "user01"
// "id" : "user01"
// "id" : "user01"
// ...
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for( int i = 0; i < 10; i++) {
// Map 생성
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", "user0" + i);
map.put("pass", "user0" + i);
// Map을 Lis에 추가
list.add(map);
}
// for문 종료 시점에 List에는 10개의 Map객체가 추가 되어있다.
// * List에 지정된 Map에서 Key가 "id"인 경우의 value를 출력*
// 향상된 for문
for(Map<String, Object> temp : list) {
System.out.println(temp.get("id"));
}
}
}