맵 Map
Map
은 Key
와 Value
를 가진 집합이며, 중복을 허용하지 않는다. ( 키는 중복X , 값은 중복 O )
{key = value, key = value …} 와 같은 형태로 저장
java.utill
패키지에 여러 집합들을 사용하기 위해 interface
와 class
가 정의되어 있다.
선언은 다음과 같이 선언한다.
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> 클래스
HashMap <K,V>
클래스- Map 컬렉션 클래스에서 가장 많이 사용되는 클래스 중 하나입니다.
- HashMap은 Map을 구현한다. key와 value를 묶어 하나의 entry로 저장한다는 특징을 갖는다.
- 해시 알고리즘(hash algorithm)을 사용하여 많은 양의 데이터를 검색하는데 검색 속도가 매우 빠르다.
- HashMap 클래스는 Map 인터페이스를 구현하므로, 중복된 키로는 값을 저장할 수 없다.
- value에 null값도 사용 가능하다.
- 멀티쓰레드에서는 HashTable을 사용한다.
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