100세까지 코딩
[자바 공부] 컬렉션(5) Map 본문
Map
- 키와 값이 한쌍으로 이루어진 자료구조
- Collection 인터페이스를 구현한 클래스와는 다르게 동작한다.
- 요소들을 반복 처리할 때 Map에 따라 추가 / 접근시간에 있어 약간의 차이가 있다.
Map 종류
HashMap | 순서를 보장하지 않는 Hashing 방식의 Map |
TreeMap | 정렬에 따른 순서를 보장하는 RedBlack Tree 형태의 Map |
LinkedHashMap | 추가대로 입력되는 순서를 보장하는 LinkedList 형태의 Map |
HashMap 예시
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapStudy {
public static void main(String[] args) {
HashMap<String,String> mapH = new HashMap<String,String>(); // 타입 지정
// HashMap mapH = new HashMap(); // 디폴트는 Object타입의 키와 값
// 요소 추가
mapH.put("키1","값1");
mapH.put("키2","값2");
mapH.put("키3","값3");
// 요소 접근
System.out.print("키1 값에 접근 : ");
System.out.println((String)mapH.get("키1"));
mapH.put("키1","값4"); // 동일한 키로 저장하면 값을 덮어버린다.
System.out.print("키1 값에 접근 : ");
System.out.println((String)mapH.get("키1"));
// 반복 처리1
System.out.println("반복 처리1");
Iterator iterator = mapH.keySet().iterator();
while(iterator.hasNext()){
Object key = iterator.next();
Object value = mapH.get(key);
System.out.println(key +" "+ value);
}
// 요소 제거
mapH.remove("키2");
// 반복 처리2
System.out.println("반복 처리2");
for(Object key : mapH.keySet()){
Object value = mapH.get(key);
System.out.println(key +" "+ value);
}
// 반복 처리3
System.out.println("반복 처리3");
for(Map.Entry<String,String> entry : mapH.entrySet()){
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println(key +" "+ value);
}
}
}
결과 :
사용자 정의 클래스의 HashMap 키
import java.util.HashMap;
public class HashMapStudy2 {
public static void main(String[] args) {
HashMap mapH = new HashMap();
mapH.put(new Cat(50), "1");
mapH.put(new Cat(30), "2");
mapH.put(new Cat(20), "3");
mapH.put(new Cat(60), "4");
for(Object o : mapH.keySet()){
System.out.println(mapH.get(o));
}
}
}
class Cat implements Comparable{
int size;
public Cat(int s){
size = s;
}
public String toString(){
return size + " ";
}
public int hashCode(){
return size % 100;
}
public boolean equals(Object ob){
Cat other = (Cat) ob;
return other.size == this.size ? true : false;
}
@Override
public int compareTo(Object o) {
return size - ((Cat) o).size;
}
}
- 별도의 해시 방법, 동일 해시 값을 갖는 객체 구별법을 지정할 수 있다.
TreeMap 예시
import java.util.Set;
import java.util.TreeMap;
public class TreeMapStudy {
public static void main(String[] args) {
TreeMap<String,String> mapT = new TreeMap<String,String>();
mapT.put("a","1");
mapT.put("b","2");
mapT.put("d","3");
mapT.put("c","4");
System.out.println("기본적으로 키값을 기준으로 정렬");
for(Object s : mapT.keySet()) {
System.out.println(s);
}
System.out.println("사용자 정의 클래스 키값을 기준으로 정렬");
// Comparable or Comparator 구현
TreeMap<Cat,String> trMap = new TreeMap<Cat,String>();
trMap.put(new Cat(50),"Fat");
trMap.put(new Cat(30),"Normal");
trMap.put(new Cat(20),"Slim");
Set<Cat> ks = trMap.keySet();
for(Cat key : ks) {
System.out.println(key + "==>" + trMap.get(key));
}
}
}
class Cat implements Comparable{
int size;
public Cat(int s){
size = s;
}
public String toString(){
return size + " ";
}
public int hashCode(){
return size % 100;
}
public boolean equals(Object ob){
Cat other = (Cat) ob;
return other.size == this.size ? true : false;
}
@Override
public int compareTo(Object o) {
return size - ((Cat) o).size;
}
}
결과 :
LinkedHashMap 예시
import java.util.LinkedHashMap;
import java.util.Set;
public class LinkedHashMapStudy {
public static void main(String[] args) {
LinkedHashMap<Cat,String> lhmap = new LinkedHashMap<Cat,String>();
lhmap.put(new Cat(50),"Fat");
lhmap.put(new Cat(30),"Normal");
lhmap.put(new Cat(20),"Slim");
lhmap.put(new Cat(60),"Big");
Set<Cat> ks = lhmap.keySet();
for(Cat key : ks){
System.out.println(key + "==>" + lhmap.get(key));
}
}
}
결과 :
정리
- HashMap : 처리 순서를 예측하기 힘들지만 배열과 해시 함수를 통해서 구현되기에 검색 및 추가 성능이 좋다.
- TreeMap : 키 값에 따라 정렬되기 때문에 순서대로 반복 처리할 경우 유리하다.
그러나, 요소 추가 시에 순서를 유지한 형태로 추가되므로 많은 요소를 추가할 경우 성능이 낮아진다. - LinkedHashMap : 입력 순서로 저장되므로 입력 순서가 중요한 경우 유리하다.
'JAVA' 카테고리의 다른 글
[자바 공부] StringTokenizer (0) | 2023.09.21 |
---|---|
[자바 공부] BufferedReader vs Scanner (0) | 2023.09.19 |
[자바 공부] 컬렉션(4) Stack & Queue (0) | 2023.09.15 |
[자바 공부] 컬렉션(3) List (0) | 2023.09.14 |
[자바 공부] 컬렉션(2) Set (0) | 2023.09.12 |