Collectio interface와 다르게 key-value의 쌍으로 이루어지는 객체를 저장한다.
객체들 간의 순서가 없다.
객체들의 Key는 중복을 허용하지 않지만 value는 중복을 허용한다.
쌍으로 이루어진 객체를 관리하는데 사용하는 메서드들이 선언되어 있다.
HashTable, HashMap, Properties, TreeMap 등이 있다.
Map collection class중에서 가장 많이 사용되는 클래스 중 하나이다.
JDK1.2부터 제공되었다.
Hash Algorithm을 사용하여 검색속도가 매우 빠르다.
검색을 위한 자료구조로 Key를 이용하여 값을 저장하고 key를 지정하여 값을 꺼내온다.
중복된 Key값으로 데이터를 넣으면 기존 데이터가 업데이트된다.
HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘린다. 하지만 List처럼 저장공간을 한칸씩 늘리지 않고 2배로 늘려서 과부하가 발생할 수 있다.
초기에 저장할 데이터 개수를 알면 Map의 초기 크기를 지정해주는 것이 좋다.
HashMap<String,String> map1 = new HashMap<String,String>();//HashMap생성
HashMap<String,String> map2 = new HashMap<>();//new에서 타입 파라미터 생략가능
HashMap<String,String> map3 = new HashMap<>(map1);//map1의 모든 값을 가진 HashMap생성
HashMap<String,String> map4 = new HashMap<>(10);//초기 용량(capacity)지정
HashMap<String,String> map5 = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정
HashMap<String,String> map6 = new HashMap<String,String>(){{//초기값 지정
put("a","b");
}};
map.remove(1); //key값 1 제거, 괄호에는 Key값 입력
map.clear(); //모든 값 제거
HashMap<String, Integer> hm = new HashMap<String, Integer>();
// put() 메소드를 이용한 요소의 저장
hm.put("삼십", 30);
hm.put("십", 10);
hm.put("사십", 40);
hm.put("이십", 20);
// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
System.out.println("맵에 저장된 키들의 집합 : " + hm.keySet());
for (String key : hm.keySet()) {
System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
// remove() 메소드를 이용한 요소의 제거
hm.remove("사십");
// iterator() 메소드와 get() 메소드를 이용한 요소의 출력
Iterator<String> keys = hm.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
// replace() 메소드를 이용한 요소의 수정
hm.replace("이십", 200);
for (String key : hm.keySet()) {
System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
// size() 메소드를 이용한 요소의 총 개수
System.out.println("맵의 크기 : " + hm.size());
Result
맵에 저장된 키들의 집합 : [이십, 삼십, 사십, 십]
키 : 이십, 값 : 20
키 : 삼십, 값 : 30
키 : 사십, 값 : 40
키 : 십, 값 : 10
키 : 이십, 값 : 20
키 : 삼십, 값 : 30
키 : 십, 값 : 10
키 : 이십, 값 : 200
키 : 삼십, 값 : 30
키 : 십, 값 : 10
맵의 크기 : 3
※Member class는 HashSet 게시글의 코드와 동일
MemberHashMap.java
package ch14;
import java.util.HashMap;
import java.util.Iterator;
public class MemberHashMap {
private HashMap<Integer, Member> hashMap;
// key가 Integer타입, value가 Member타입
public MemberHashMap() {
hashMap = new HashMap<>();
}
public void addMember(Member member) {
//값을 넣을때는 <key, value>를 put, 받아올때는 key를 기반으로 get
hashMap.put(member.getMemberId(), member);
}
public boolean removeMember(int memberId){
if(hashMap.containsKey(memberId)){
hashMap.remove(memberId);
return true;
}
System.out.println(memberId + "가 존재하지 않습니다");
return false;
}
public void showAllMember(){
// keySet을 하면 key들이 set의 형식으로 return 된다.
// values를 하면 value들이 return
Iterator<Integer> ir = hashMap.keySet().iterator();
while (ir.hasNext()){
int key = ir.next();
Member member = hashMap.get(key);
System.out.println(member);
}
System.out.println();
}
}
MemberHashMap.java
package ch14;
public class MemberHashMapTest {
public static void main(String[] args) {
MemberHashMap memberHashMap = new MemberHashMap();
Member memberLee = new Member(1001, "이순신");
Member memberKim = new Member(1002, "김유신");
Member memberKang = new Member(1003, "강감찬");
Member memberHong = new Member(1004, "홍길동");
memberHashMap.addMember(memberLee);
memberHashMap.addMember(memberKim);
memberHashMap.addMember(memberKang);
memberHashMap.addMember(memberHong);
memberHashMap.showAllMember();
memberHashMap.removeMember(1004);
memberHashMap.showAllMember();
}
}