메모장

HashMap 본문

JAVA/개념정리

HashMap

Itchild 2024. 4. 7. 20:58
728x90
반응형

 

해시맵(HashMap)은 이름 그대로 해싱(Hashing)된 맵(Map)이다.

해싱을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.

 

해싱(hashing)은 통상적인 반복 비교를 통하지 않고 특정 계산만으로

자료 저장 주소를 찾아내는 탐색 방법을 뜻한다.

 

Map 인터페이스를 구현한 Map 컬렉션 중 하나이고, Map 인터페이스를 상속하고 있기 때문에 Map의 성질을 그대로 가지고 있다.

맵이란 키(Key)와 값(Value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있는 자료구조이다.

여기서 키와 값은 모두 객체이다. 키는 맵에 유일하게 있어야 되고, 중복을 허용하지 않지만 값은 중복된 값이어도 상관 없다. 같은 키의 값을 삽입하려고 하면 해당 키의 값이 변경된다.

삽입한 순서에 따라 정렬 되지 않는다.

해시맵의 키(key)로 객체 값이 들어올 수 있다. 해시맵은 키와 값의 쌍으로 데이터를 저장하는 자료구조이며, 키는 고유한 식별자로 사용된다.

 

 

HashMap 사용법 , 예제

 

 

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

 

import java.util.HashMap;
import java.util.Map;
public class Test {
	public static void main(String[] ar) {
		Map<String,Integer> map=new HashMap();	//<키 자료형, 값 자료형>
		map.put("A", 1);
		map.put("B", 2);
		map.put("C", 3);
		map.put("C", 4); //중복된 key가 들어갈때는 이전 키,값을 지금의 것으로 업데이트
		System.out.println(map);
		System.out.println(map.get("A"));
		System.out.println(map.get("B"));
		System.out.println(map.get("C"));
	}
}
 

 

결과 :

{A=1, B=2, C=4}
1
2
4
 

 

containsKey 사용

 

public static void main(String[] ar){
	Map<String,Integer> map=new HashMap();
	map.put("key1", 1);
	map.put("key2", 2);
	if(!map.containsKey("key2")// 키가 들어있는지 확인.포함되어 있지 않니?
                               // 있으면 덮어쓰지 않는다
		map.put("key2", 3); 
	System.out.println(map);
	System.out.println(map.get("key1"));
	System.out.println(map.get("key2"));
}
 

 

결과 :

{key1=1, key2=2}
1
2
 

 

 

keySet 사용 (모든 키를 순회)

 

list처럼 증가하는 index를 사용할 방법이 없지만 keySet메소드를 이용하여 키를 Set으로 넘겨주어 Map에 존재하는 키를 모두 순회할 수 있습니다.

 

// HashMap 선언, 초기값 지정
HashMap<Integer,String> hm = new HashMap<Integer,String>(){{
    put(1, "One");
    put(2, "Two");
    put(3, "Three");
    put(4, "Four");
}};
System.out.println(hm); // 전체 출력 : {2=Two, 3=Three, 4=Four}
System.out.println(hm.get(3)); // Key 값 3의 Value 가져오기 : Three


//entrySet() 활용
for(Map.Entry<Integer,String> entry : hm.entrySet()) {
    System.out.println("Key :" + entry.getKey() + " Value :" + entry.getValue());
}

//keySet() 활용
for (int i : hm.keySet()) {
    System.out.println("Key :" + i + " Value :" + hm.get(i));
}
 

 

결과:

//출력결과
//Key :1 Value :One
//Key :2 Value :Two
//Key :3 Value :Three
//Key :4 Value :Four

//출력결과
//Key :1 Value :One
//Key :2 Value :Two
//Key :3 Value :Three
//Key :4 Value :Four
 

특정 Key의 Value를 가져오고 싶다면 get(key)를 사용하고, 전체를 출력하려면 entrySet() 또는 keySet() 메소드를 활용하여 Map의 객체를 반환받은 후 출력할 수 있다.

entrySet()은 Key와 Value로 구성된 Entry의 Set을 받기 때문에 Key와 Value가 모두 필요할 경우 사용한다.

keySet()은 Key의 Set을 반환받기 때문에 Key 값만 필요할 경우 사용하는데, 위의 코드와 같이 get(key) 메소드를 통해 Value까지 받아올 수도 있다.

  • keySet()을 활용하여 value까지 찾을 경우, key 값을 이용해서 value를 찾는 과정에서 시간이 많이 소모되기 때문에 많은 양의 데이터를 가져와야 한다면 entrySet()이 좋다.

HashMap의 put(key,value) 메소드와 get(key) 메소드를 이용해서 특정 key의 value를 순차적으로 증가시킬 수도 있다.

 

 

HashMap.equals()

 

// HashMap 선언, 초기값 지정
HashMap<Integer,String> hm1 = new HashMap<Integer,String>(){{
    put(1, "One");
    put(2, "Two");
}};
HashMap<Integer,String> hm2 = new HashMap<Integer,String>(){{
    put(1, "One");
    put(2, "Two");
}};
HashMap<Integer,String> hm3 = new HashMap<Integer,String>(){{
    put(1, "One");
    put(3, "Three");
}};
System.out.println(hm1.equals(hm2)); // 출력결과 : true
 

두 Map이 같은지 비교하려면 두 Map의 매핑 상태가 같다면 true, 같지 않다면 false를 리턴하는 equals()메소드를 사용한다.

 

 

 


HashMap의 경우 다 좋은데, 단점이 하나 있다. 그 단점은 put을 통해 데이터나 객체를 넣을때 key의 순서가 지켜지지 않는다는 것이다. 개발을 할때 코드상으로 순차적으로 key/value를 넣어도, 실제 HashMap에서는 해당 순서가 지켜지지 않는다.

 

업무의 특성이나 개발방법에 따라 입력된 key의 순서가 보장되어야 할때가 있고, 그렇지 않을때가 있다. 만약 입력된 Key의 순서가 보장되어야 한다면 LinkedHashMap을 사용하면 된다.

 

LinkedHashMap은 put을 통해 입력된 순서대로 Key가 보장되므로 해당 문제를 해결할 수 있다. 물론 사용법은 HashMap과 동일하다.

 

 

 

728x90
반응형