HashMap

황상익·2023년 10월 20일
0

자료구조 정리

목록 보기
4/13

<HashMap?>
Map 인터페이스를 구현한 대표적인 Map 컬랙션. Map 인터페이스를 상속하고 있기 때문에 Map 성질을 그대로 보유. Map은 Entity 객체를 저장하는 구조를 갖고 있는 자료구조. key & value는 모두 객체.
value는 중복이 가능 but key는 중복 불허.
하지만 기존 저장된 key와 동일한 key로 저장시 이전에 있던 key 값이 새로운 값으로 대치. 또한 HashMap은 Hash성을 지니고 있기 때문에 검색에 매우 용이 하다.

사용자는 key 값이 저장되는 위치를 알 수 없고, 순서와 들어 있는 위치 또한 관계 없음

<HashMap 사용법>

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");
}};

HashMap을 생성하면 key 타입과 value 타입을 파라미터로 주고 생성자를 호출. HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘리는데 이때 List는 한칸을 늘리지만 HashMap은 두칸을 늘린다.
따라서 과부하에 주의 요망한다.

<HashMap 값 추가>

HashMap<Integer,String> map = new HashMap<>();//new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");

값을 추가 하러면 put 메서드 사용.
선언 시 HashMap에 설정해준 타입과 같은 타입의 key와 value 값을 넣어야만 한다.

<HashMap 삭제>

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
map.remove(1); //key값 1 제거
map.clear(); //모든 값 제거

HashMap에서 값 삭제를 하고 싶다면 remove 메서드 사용
key 값으로만 Map의 요소를 삭제 할 수 있다.
만약 모든 값 제거 하고 싶다면 clear 메서드 사용

<HashMap 값 출력>

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
		
System.out.println(map); //전체 출력 : {1=사과, 2=바나나, 3=포도}
System.out.println(map.get(1));//key값 1의 value얻기 : 사과
		
//entrySet() 활용
for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

//KeySet() 활용
for(Integer i : map.keySet()){ //저장된 key값 확인
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

print로 출력을 하게 되면 key,value가 출력
특정 key값을 가져오고 싶다면, get(key) 하면 되고, 전체 출력을 하고 싶다면 entrySet() 이나 keySet() 메소드를 활용 -> Map 객체를 반환받은 후, 출력.
entrySet() key와 value가 모두 필요한 경우.
keySet()은 key 값만 필요할 경우에 사용.
but get(key)를 활용해도 -> key,value 둘다 가져 올 수 있다
3개의 차이는 시간적 차이 많은 양의 데이터를 가져와야 한다면 entrySet을 주로 사용

<Iterator 사용>

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
		
//entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Map.Entry<Integer, String> entry = entries.next();
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" +  entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
		
//keySet().iterator()
Iterator<Integer> keys = map.keySet().iterator();
while(keys.hasNext()){
    int key = keys.next();
    System.out.println("[Key]:" + key + " [Value]:" +  map.get(key));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

HashMap의 전체 출력시 반복문을 사용하지 않고 Iterato를 사용해도 ok
iterator로 Map 안에 요소를 출력하는 방법 중 하나.

<정리하면서 느낀점>
HashMap에는 여러 요소가 있고 여러 메소드가 있다는걸 알았다.
내가 주로 사용하는 put 이나 remove, clear, getKey 이런 기본적인 부분은 인지를 하고 있었으나 entrySet이라던지 iterator로 전체를 가져오거나, 전체를 반복하여 가져 올 수 있다는 부분은 새로웠다.
새로 알게된 메서드를 바로 활용하기에는 어렵겠지만 인지하고, 모르면 내가 정리한 부분을 찾아봐서 써야겠다.

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글