목차
1. Map 키워드 설명
1.1. HashMap
1.2. HashTable
1.3. LinkedHashTable
1.4. TreeMap설명
2. HashMap 사용법
2.1 선언
2.2 CRUD
2.3 출력 및 참고 메소드
3. HashTable 사용법
3.1 선언
3.2 CRUD
3.3 출력 및 참고 메소드
4. LinkedHashTable 사용법
4.1 선언
4.2 CRUD
4.3 출력 및 참고 메소드
5. TreeMap 사용법
5.1 선언
5.2 CRUD
5.3 출력 및 참고 메소드
Interface, Class
- 인터페이스란 직접 인스턴스를 구성할 수 없으며 Class와 같은 구체적인 클래스로 인스턴스를 생성 해야함.
Extends, Implements
- -
Map 키워드 설명
- Map
- Map은 Interface 로 <Key, Value>를 쌍으로 저장하고 관리하는 데이터 구조
- Key는 저장 순서를 보장하지 않고 중복도 허용하지 않는다. (=Set 과 동일)
- <Key,Value> 모두 객체로 사용
- Map 인터페이스는 범용적이라서, 구체적인 구현 클래스를 나중에 변경 가능
- Map은 직접 인스턴스를 생성할 수 없다.
- 주요 클래스는 HashTable, LinkedHashTable, HashMap, TreeMap
/* Map 유연성 및 의존성을 낮춰준다. */
Map<Character, Integer> alphabetCount = new HashMap<Character, Integer>();
/* HashMap 구체화 */
HashMap<String, Object> alphabetCount = new HashMap<String, Object>();
/* 내가 선호하는 방법 */
Map<String, Object> alphabetCount = new HashMap<>();
- HashMap
- 데이터의 추가,삭제,검색속도가 빠르고 순서가 중요하지 않는 경우에 사용
- 해시 충돌이 발생할 우려 존재 (추후 정리)
- <Key, Value>가 바로 매핑되지 않고 해시 키를 해시코드로 변환하여 데이터를 저장하고 검색
- 멀티스레드 환경에서 부적합 ( HashTable이 적합)
- 동시에 HashMap을 건드리면 Key-value값이 문제가 된다.
- HashTable
- <Key, Value>가 바로 매핑되지 않고 해시 함수를 통해 해시 값을 생성하여 주소값처럼 사용해 검색에 용이하게 만듬
- 멀티스레드 환경에서 적합 ( HashMap이 부적합 )
- 동시에 HashMap을 건드리면 Key-value값이 문제가 된다.
- 동기화를 보장
- LinkedHashTable
- 데이터의 추가된 순서를 보존하고자 할때 사용
- TreeMap
- 순서가 중요하고 정렬된 데이터 유지 필요시 사용
- Key를 기준으로 정렬이 되어 있다. (binary search tree)
- 정렬 기준은 이진 트리 기반
- 이진트리란
- 2가지의 길 밖에 없으니 크면 오른쪽 작으면 왼쪽 으로 움직여 자리를 찾아가는 기법
- 장점은 추가,제거에 속도가 빠르다.
- 이진트리란
- 정렬 기준은 이진 트리 기반
HashMap 사용법
Step1.선언
HashMap<String,Integer> map = new HashMap<String, Integer>();
Map<String, Integer> map = new HashMap<String, Integer>();
Map<Object,Object> map = new HashMap<>();
Map<Object,Object> map = new HashMap<>(10);//초기 용량(capacity)지정
Map<Object,Object> map = new HashMap<>(map);
Map<Object,Object> map = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정
Map<Object,Object> map = new HashMap<String,String>(){{//초기값 지정
put("a","b");
}};
/*
* Method : HashMap()
* Explain : HashMap객체 생성
*/
HashMap<String,Integer> map = new HashMap<String, Integer>();
Map<String, Integer> map = new HashMap<String, Integer>();
/*
* Method : HashMap(int initlalCapacity)
* Explain : 초기 용량
*/
Map<Object,Object> map = new HashMap<>();
Map<Object,Object> map = new HashMap<>(10);//초기 용량(capacity)지정
/*
* Method : HashMap(Map m)
* Explain : Map에 저장된 모든 요소를 포함하는 HashMap을 생성.
*/
Map<Object,Object> map = new HashMap<>(map);
/*
* Method : HashMap(int initlalCapacity, float loadFactory)
* Explain : loadFactory 은 해시맵의 버킷 비율이 값만큼 채워지면 리사이징 작업을 해 해시 충돌 최소화.
로드 팩터를 높이면 메모리 사용량은 줄지만, 충돌 가능성이 높다.
*/
Map<Object,Object> map = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정
Map<Object,Object> map = new HashMap<String,String>(){{//초기값 지정
put("a","b");
}};
Step2. CRUD
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("A", 1);
map.put("B", 1);
map.put("A", 100); //최종값으로 업데이트
map.put("A", map.get("A") -99); //업데이트 방법
map.replace("A",50);
map.get("A");
map.remove("A");
map.clear();
Map<String, Integer> map = new HashMap<String, Integer>();
/*
* Method : Object put(Object Key, Object Value)
* Explain : 값 생성 및 업데이트
*/
map.put("A", 1);
map.put("B", 1);
map.put("A", 100); //최종값으로 업데이트
map.put("A", map.get("A") -99); //업데이트 방법
map.replace("A",50);
/*
* Method : Object get(Object Key)
* Explain : 값 읽기
*/
map.get("A");
/*
* Method : Object remove(Object Key)
* Explain : 값 삭제
*/
map.remove("A");
/*
* Method : void clear()
* Explain : 객체 모두 삭제
*/
map.clear();
Step3. 그외 참조할 코드
map.size();
map.isEmpty();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
boolean containsKey(Object Key)
boolean containsValue(Object Value)
map.containsKey("B"); //true
map.containsValue(4); //false
값 출력은 entrySet(), KeySet(), Iterator 등
Iterator은 자바의 컬렉션 프레임 워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 한 것
/******전체 출력*******/
/*
KeySet() 활용
HashMap에 저장된 모든 키를 Set으로 반환한다.
*/
Set<String> keyset = map.keySet();
System.out.println(keyset); // [A,B,C]
/*
entrySet() 활용
HashMap에 저장된 <Key,Value>값을 Entry(키,값을 결합)의 형태로 Set에 저장하여 반환
Map.Entry<> 로 entrySet()이 반환하는 key,Value를 갖는 하나의 객체로 얻을 수 있다.
전환 과정을 학습하기 위해서 번거롭게 한거임
*/
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
/* 단순하게 */
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
/******요소 값 출력*******/
/*
keySet() 활용
*/
for (String key : map.keySet()) {
System.out.println(key + "=" + map.get(key));
}
/*
entrySet() 활용
*/
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
/*
keySet() 활용
*/
for (String key : map.keySet()) {
System.out.println(key + "=" + map.get(key));
}
// iterator() 메소드와 get() 메소드를 이용한 요소의 출력
Iterator<String> keys = map.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
System.out.println(key + "=" + map.get(key));
}
//HashMap에 넣은 key,Value를 Set에 넣고 iterator에 값으로 Set 정보를 넣는다.
//Interator itr = map.entrySet().interator() 와 같다.
Set<Map.Entry<String, Integer>> set = map.entrySet();
Iterator<Map.Entry<String, Integer>> itr = set.iterator();
while (itr.hasNext()) {
Map.Entry<String, Integer> e = itr.next();
System.out.println(e.getKey() + " : " + e.getValue());
}
/* 단순하게 */
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
//entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
Map.Entry<String, Integer> entry = entries.next();
System.out.println(entry.getKey() + " : " + entry.getValue());
}
//keySet().iterator()
Iterator<String> keys = map.keySet().iterator();
while(keys.hasNext()){
String key = keys.next();
System.out.println(key + " : " + map.get(key));
}
TreeMap<Integer, String> tm = new TreeMap<Integer, String>();
// put() 메소드를 이용한 요소의 저장
tm.put(30, "삼십");
tm.put(10, "십");
tm.put(40, "사십");
tm.put(20, "이십");
// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
System.out.println("맵에 저장된 키들의 집합 : " + tm.keySet());
for (Integer key : tm.keySet()) {
System.out.println(String.format("키 : %s, 값 : %s", key, tm.get(key)));
}
// remove() 메소드를 이용한 요소의 제거
tm.remove(40);
// iterator() 메소드와 get() 메소드를 이용한 요소의 출력
Iterator<Integer> keys = tm.keySet().iterator();
while (keys.hasNext()) {
Integer key = keys.next();
System.out.println(String.format("키 : %s, 값 : %s", key, tm.get(key)));
}
// replace() 메소드를 이용한 요소의 수정
tm.replace(20, "twenty");
// size() 메소드를 이용한 요소의 총 개수
tm.size();