[자료구조] HashMap - 개념 및 구현

Benjamin·2023년 8월 25일
0

자료구조

목록 보기
8/9
post-custom-banner

HashMap

개념

  • 해싱(Hashing)된 맵(Map)
    -> 해싱 : 해시 함수에 문자열 입력값을 넣어서 특정한 값으로 추출하는 것
    -> 맵 : 키(Key) 와 값(Value) 두 쌍으로 데이터를 보관하는 자료구조.

  • 키는 맵에 오직 유일하게 있어야함 ,값은 중복가능

  • 키와 값을 매핑하기 위해 해시라는 것을 사용한다.
    HashTable과 달리 보조 해시 함수를 사용하기 때문에, 보조 해시 함수를 사용하지 않는 HashTable에 비하여 해시 충돌이 덜 발생할 수 있어 상대적으로 성능상 이점이 있다.

HashMap과 사용법이 거의 동일한 컬렉션(Collection)에는 Hashtable이 있습니다.

해시맵과 해시테이블의 차이점

  • Thread 관점에서 안전하냐(Hashtable), 안전하지 않은 대신 속도가 빠르냐(HashMap)

자신이 만든 객체도 키로 사용할 수 있다.

사용법

HashMap과 Map은 java.util 안에 위치

1. 키,값 저장(put), 읽기(get)

  • put : 키와 값을 map에 저장하는 메소드
  • get : 입력받은 key와 대응되는 값을 돌려준다.
    만약 해당하는 key가 없다면 null을 넘겨주게 된다.
import java.util.HashMap;
import java.util.Map;
public class Main {
	public static void main(String[] ar) {
		Map<String,Integer> map=new HashMap();	//< 자료형,  자료형>
		map.put("A", 100);
		map.put("B", 101);
		map.put("C", 102);
		map.put("C", 103); //중복된 key가 들어갈때는 이전 키,값을 지금의 것으로 업데이트
		System.out.println(map);
		System.out.println(map.get("A"));
		System.out.println(map.get("B"));
		System.out.println(map.get("C"));
	}
}

결과

{A=100, B=101, C=103}
100
101
103

2. containsKey

  • 키가 존재하는지 존재하지 않는지 알 수 있다.
  • 비슷한 메소드 containsValue : 값이 존재하는지 알아보는 메소드
  • 존재시 true, 없을때는 false를 반환합니다.
public static void main(String[] ar){
	Map<String,Integer> map=new HashMap();
	map.put("key1", 100);
	map.put("key2", 200);
	if(!map.containsKey("key2"))	//키가 들어있는지 확인. 있으면 덮어쓰지 않는다.
		map.put("key2", 300); 
	System.out.println(map);
	System.out.println(map.get("key1"));
	System.out.println(map.get("key2"));
}

결과

{key1=100, key2=200}
100
200

위의 if문과 put메소드를 한꺼번에 처리할 수 있는 메소드가 존재한다. putIfAbsent
두 라인을 아래와 같이 바꿔써도 같은 동작을 한다.

//if(!map.containsKey("key2"))	//키가 들어있는지 확인. 있으면 덮어쓰지 않는다.
			//map.put("key2", 300); 
map.putIfAbsent("key2",300);

3. putAll

  • map을 통째로 인자로 넘겨주고 싶을때
  • 주의해야할 점 : 반드시 키와 값의 자료형이 같은 map이어야한다는 점이다.
    다른 자료형의 키, 값은 받을 수 없다.
public static void main(String[] ar) {
	Map<String,Integer> map1=new HashMap();
	Map<String,Integer> map2=new HashMap();
	//map1 put
	map1.put("map1-key1", 100);
	map1.put("map1-key2", 200);
		
	//map2 put
	map2.put("map2-key3", 300);
	map2.put("map2-key4", 400);
		
	System.out.println("map1:"+map1);
	System.out.println("map2:"+map2);
		
	//map2에 map1을 합침
	map2.putAll(map1);
	System.out.println("map2 includes map1:"+map2);
		
	//map1의 키, 값 변경
	map1.put("map1-key1", 1000);
	//map2에는 영향 없음.
	System.out.println("map2 includes map1:"+map2);
}

결과

map1:{map1-key1=100, map1-key2=200}
map2:{map2-key4=400, map2-key3=300}
map2 includes map1:{map2-key4=400, map1-key1=100, map1-key2=200, map2-key3=300}
map2 includes map1:{map2-key4=400, map1-key1=100, map1-key2=200, map2-key3=300}

putAll 대신 생성자를 이용해서 생성과 동시에 map의 데이터를 전부 넘겨줄 수도 있습니다.

Map<String,Integer> map2=new HashMap(map1);

post-custom-banner

0개의 댓글