맵 Map

MapKeyValue를 가진 집합이며, 중복을 허용하지 않는다. ( 키는 중복X , 값은 중복 O ) {key = value, key = value …} 와 같은 형태로 저장 java.utill 패키지에 여러 집합들을 사용하기 위해 interfaceclass가 정의되어 있다.

선언은 다음과 같이 선언한다.

Map<자료형, 자료형> 객체명 = new Hash<자료형, 자료형>();
좌변에는 `Map`, 우변에는 HashMap으로 선언하는 이유?

Java에서 HashMap 이란 무엇인가?

HashMap은 데이터를 저장할 때 키(Key)와 밸류(Value)가 짝을 이루어 저장됩니다. 데이터를 저장할 때는 키(Key) 값으로 해시함수를 실행한 결과를 통해 저장위치를 결정합니다. 따라서 HashMap은 특정 데이터의 저장위치를 해시함수를 통해 바로 알 수 있기 때문에 데이터의 추가, 삭제, 특히 검색이 빠르다는 장점이 있습니다.  이러한 이유로 HashMap은 키(Key)값을 통해서만 검색이 가능하며, HashMap의 키(Key) 값은 중복될 수 없고, 밸류(Value) 값은 키(Key) 값이 다르다면 중복이 가능합니다. 

HashMap 생성방법

(방법1) HashMap<String, String> h1 = new HashMap<String, String>( );         // 기본 capacity:16, load factor:0.75
(방법2) HashMap<String, String> h2 = new HashMap<String, String>(20);       // capacity:20으로 설정
(방법3) HashMap<String, String> h3 = new HashMap<String, String>(20, 0.8); // capacity:20, load factor:0.8로 설정
(방법4) HashMap<String, String> h4 = new HashMap<String, String>(h1);      // 다른 Map(h1)의 데이터로 초기화

자주 사용하는 HashMap 메서드

1. 데이터 추가

  • map.put(a,b)
  • 중복된 key가 들어올 경우 덮어쓴다.
Map<Suring, String> map = new HashMap<String, String>():
map.put("1", "홍길동");
map.put("2", "김길동");
map.put("3","김길동");
map.put("1", "홍길동2"); // 중복된 Key가 들어올 경우 덮어쓰기 
System.out.println(map): //{1=홍길동2, 2=김길동, 3=김길동} //key 1이 중복되어 홍길동이 덮어씌워져 사라짐
System.out println(map.size()); // 맵의 갯수 : 3

2. 데이터 반환

  • map.get(“key”)
  • key에 해당하는 값(value) 반환
System.out.println(map.get("1")); // 홍길동2

3. 데이터 삭제

  • remove
  • clear System.out.println(map.remove(“people”));

/* remove(Object key)
* 주어진 Key에 해당하는 키-값 쌍을 제거합니다.
*/

Map<String, String> map = new HashMap<>();
map.put("people", "student");
System.out.println(map.remove("people")); // "student" 출력

/* remove(Object key, Object value) 
 * 주어진 key와 value가 모두 일치하는 경우에만 해당 항목을 삭제합니다.
 * 삭제에 성공하면 true, 실패하면 false를 반환합니다.
*/
Map<String, String> map = new HashMap<>();
map.put("people", "student");
System.out.println(map.remove("people", "student")); // true
System.out.println(map.remove("people", "teacher")); // false

/* clear()  : Map의 모든 데이터를 삭제 / 반환 값 X 
*/
Map<String, String> map = new HashMap<>();
map.put("people", "student");
map.put("city", "Seoul");
map.clear();
System.out.println(map.size()); // 0 출력

4. 데이터 갯수

  • size 메소드는 Map의 갯수를 리턴한다.
System.outprinln(map.size()); // 00 출력

5. 데이터 수정

Map<String, String> map = new HashMap<>();
map.put("people", "student");

// 값 변경
System.out.println(map.replace("people", "teacher")); // "student" (기존 값 반환)
System.out.println(map.get("people")); // "teacher"

// key가 없으면 null 반환
System.out.println(map.replace("city", "Seoul")); // null

 

6. 데이터 확인

  • map.containsKey(“a”)
  • “a”라는 값을 key로 갖고 있는지 여부 T/F
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("1", 10); 
map.put("2", 20); 
map.put("3", 30);
map.put("4", 40);
map.put("5", 50);

System.out.println(map); // { 1=10, 2=20, 3=30, 4=40, 5=50 }
System.out.println(map.containsKey("1")); //true
System.out.println(map.containsKey("10")); //false

  • map.containsValue(“a”):
  • “a”라는 값을 value로 갖고 있는지 여부 T/F
System.out.println(map.containsValue(50));
System.out.println(map.containsValue(50));

대표적인 Map 컬렉션 클래스에 속하는 클래스

HashMap<K,V> 클래스

  1. HashMap <K,V> 클래스
    • Map 컬렉션 클래스에서 가장 많이 사용되는 클래스 중 하나입니다.
    • HashMap은 Map을 구현한다. key와 value를 묶어 하나의 entry로 저장한다는 특징을 갖는다.
    • 해시 알고리즘(hash algorithm)을 사용하여 많은 양의 데이터를 검색하는데 검색 속도가 매우 빠르다.
    • HashMap 클래스는 Map 인터페이스를 구현하므로, 중복된 키로는 값을 저장할 수 없다.
    • value에 null값도 사용 가능하다.
    • 멀티쓰레드에서는 HashTable을 사용한다.
  2. HaspMap <k,v> 주요 메소드
메서드 설명
void clear() 해당 맵(map)의 모든 매핑(mapping)을 제거함.
boolean containsKey(Object key) 해당 맵이 전달된 키를 포함하고 있는지를 확인함.
boolean containsValue(Object value) 해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함.
V get(Object key) 해당 맵에서 전달된 키에 대응하는 값을 반환함. 해당 맵이 전달된 키를 포함하지 않으면 null을 반환함.
boolean isEmpty() 해당 맵이 비어있는지를 확인함.
Set<K> keySet() 해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함.
V put(K key, V value) 해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함.
V remove(Object key) 해당 맵에서 전달된 키에 대응하는 매핑을 제거함.
boolean remove(Object key, Object value) 해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함.
V replace(K key, V value) 해당 맵에서 전달된 키에 대응하는 값을 특정 값으로 대체함.
boolean replace(K key, V oldValue, V newValue) 해당 맵에서 특정 값에 대응하는 전달된 키의 값을 새로운 값으로 대체함.
int size() 해당 맵의 매핑의 총 개수를 반환함.

HashMap 사용예제

1. HashMap 생성 및 실행

public class HelloWorld {
	public static void main(String[] args) {
		HashMap<String, String> h1 = new HashMap<String, String>();
		HashMap<String, String> h2 = new HashMap<String, String>();
		
		h1.put("aaa", "1111");
		h1.put("bbb", "2222");
		h1.put("ccc", "3333");
		h1.putIfAbsent("aaa", "0000");
		h1.putIfAbsent("ddd", "4444");
		h2.putAll(h1);
		System.out.println("h1 : " + h1);
		System.out.println("h2 : " + h2);
		
		System.out.println("[1]: " + h1.containsKey("aaa"));
		System.out.println("[2]: " + h1.containsValue("1111"));
		System.out.println("[3]: " + h1.isEmpty());
		System.out.println("[4]: " + h1.size());
		System.out.println("[5]: " + h1);
		System.out.println("[6]: " + h1.remove("aaa", "1111"));
		System.out.println("[7]: " + h1.put("bbb", "0000"));
		System.out.println("[8]: " + h1.replace("ccc", "0000"));
		System.out.println("h1 : " + h1);
		System.out.println("h2 : " + h2);
				
		
		for (String key: h1.keySet()) {
			String value = h1.get(key);
			System.out.println("Key:" + key + ", Value:" + value);	
		}
	}
}

2) 실행 결과

h1 : {aaa=1111, ccc=3333, bbb=2222, ddd=4444}
h2 : {aaa=1111, ccc=3333, bbb=2222, ddd=4444}
[1]: true
[2]: true
[3]: false
[4]: 4
[5]: {aaa=1111, ccc=3333, bbb=2222, ddd=4444}
[6]: true
[7]: 2222
[8]: 3333
h1 : {ccc=0000, bbb=0000, ddd=4444}
h2 : {aaa=1111, ccc=3333, bbb=2222, ddd=4444}
Key:ccc, Value:0000
Key:bbb, Value:0000
Key:ddd, Value:4444

참고 URL