<자료구조>HashMap

ming·2023년 3월 16일

자료구조

목록 보기
4/12

HashMap 이란?

HashMap은 Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있다.
(Map은 키와 값으로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조)
값은 중복 저장가능, 키는 중복 저장X. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 덮어씌워진다.
HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보입니다.

HashMap은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 들어 있는 위치 또한 관계가 없다.

특징

  • 리스트, 배열은 순차적으로 값을 구하는 반면,맵은 key를 통해 value를 얻는다.
  • 키와 값은 모두 객체이다.
  • 값value은 중복될 수 있지만, 키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<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<Integer,String> map = new HashMap<>();//new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");

put(key,value) 메소드: 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(); //모든 값 제거

remove(key) 메소드: 오직 키값으로만 Map의 요소를 삭제할 수 있다.
clear() 메소드: 모든 값을 제거

값 출력 3가지 방법

그냥 print하게 되면 {}로 묶어 Map의 전체 key값, value가 출력된다.
{키=값, 키=값,...}

1. KeySet()

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
//그냥 print		
System.out.println(map); //전체 출력 : {1=사과, 2=바나나, 3=포도}

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

keySet() 은 key값만 필요할 경우 사용하는데 key값만 받아서 get(key)를 활용하여 value도 출력할 수도 있다.
key값을 이용해서 value를 찾는 과정에서 시간이 많이 소모된다는 단점이 있다.

2. 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]:포도

entry.getKey(), entry.getValue() 으로 key와 value 모두가 필요할 경우에 사용한다.

많은 양의 데이터를 가져와야 한다면 entrySet()이 좋다.(keySet()보다 약 20%~200% 성능 차이가 있음)

3. Iterator 사용

HashMap의 전체출력 시 반복문을 사용하지 않고 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]:포도

그 외 사용법

  • get() : 맵에서 key에 해당하는 value구하기. key에 해당하는 value를 반환.
  • containsKey() : 맵에서 key가 있는지 탐색하기. 있으면 true,없으면 false 반환.
  • size() : 맵의 요소의 갯수를 반환.

참고한 출처 : https://coding-factory.tistory.com/556 감사합니다 : )

profile
개발 성장 기록

0개의 댓글