Hash Map

Jemny·2023년 10월 19일
0

자료구조

목록 보기
4/6

해쉬맵 자료구조의 기본구조

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

맵이란 키(Key)와 값(Value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있는 자료구조이다.
여기서 키와 값은 모두 객체이다. 키는 맵에 유일하게 있어야 되고, 중복을 허용하지 않지만 값은 중복된 값이어도 상관 없다.
같은 키의 값을 삽입하려고 하면 해당 키의 값이 변경된다.

ex) key에 영어값이 저장되어있고 value에 한글값이 저장되어있는 해쉬맵이 있다고 가정하자.

  • key값으로 apple이 온다면 value값으로는 사과가 오는 형식으로 데이터가 저장되어있다.
  • 여기서 key 값으로 사용한 apple은 중복사용할 수 없지만, value값으로 사용한 사과는 다른 key값에서 중복으로 사용할 수 있다.
  • 다른 데이터에서 중복으로 key값을 apple로 선언 할 경우 새로운 데이터가 생성되는것이 아니라 기존의 key값이 apple이었던 데이터의 value값이 변경된다.

자바에서 해쉬맵을 선언하는 방법

import java.util.HashMap;

HashMap<Integer,Integer> map1 = new HashMap<Integer,Integer>();
// Key - Integer / Value - Integer 타입의 Entry를 갖는 HashMap 선언

HashMap<Integer,Integer> map2 = new HashMap<>();
// New에서 타입 파라미터 생략 가능

HashMap<Integer,Integer> map3 = new HashMap<>(10);
// 초기 용량(capacity) 지정

HashMap<String,String> map4 = new HashMap<String,String>();
// Key - String / Value - String 타입의 Entry를 갖는 HashMap 선언

HashMap<String,String> map5 = new HashMap<String,String>(){{
    put("Key1", "Value1");
    put("Key2", "Value2");
}};
// 초기값 지정
  • 저장공간을 넘어서는 데이터가 들어오면 한칸씩 늘리는 List와 달리 Hash Map은 기존공간을 두배씩 늘리기 때문에 과부하 방지를 위해 데이터의 갯수를 알고있다면 초기에 저장공간을 지정해 주는것이 좋다.

해쉬맵에 새로운 값을 추가할 때

HashMap<Integer,String> hm = new HashMap<Integer,String>();
// Key - Integer / Value - Integer 타입의 Entry를 갖는 HashMap 선언

//값 추가
hm.put(1, "One");
hm.put(2, "Two");
hm.put(3, "Three");
hm.put(4, "Four");

System.out.println(hm);
//출력결과 : {1=One, 2=Two, 3=Three, 4=Four}
  • 새로운 데이터를 입력할때는 key과 value를 선언한 해쉬맵의 타입에 맞춰서 입력해준다.
  • 기존에 존재하던 key를 사용한 경우 해당 key값의 value값이 업데이트 된다.

해쉬맵에서 값을 제거할 때

// HashMap 선언, 초기값 지정
HashMap<Integer,String> hm = new HashMap<Integer,String>(){{
    put(1, "One");
    put(2, "Two");
    put(3, "Three");
    put(4, "Four");
}};
hm.remove(1); // key값 1 제거
System.out.println(hm); // 출력결과 : {2=Two, 3=Three, 4=Four}
hm.clear(); // 모든 값 제거
System.out.println(hm); // 출력결과 : {}
  • 한개의 데이터를 삭제할때는 remove()에 key값을 할당해준다.
  • 모든 데이터를 삭제할때는 clear()메소드를 이용한다.

그밖에 해쉬맵에 관한 메소드

// 해쉬맵의 크기를 구하는 메소드
HashMap<Integer,String> hm = new HashMap<Integer,String>(){{
    put(1, "One");
    put(2, "Two");
    put(3, "Three");
    put(4, "Four");
}};
System.out.println(hm.size()); // HashMap 크기 출력 : 4

--------------------------------------------------------------------------------------

// 특정 key나 value가 존재하는지 여부
HashMap<Integer,String> hm = new HashMap<Integer,String>(){{
    put(1, "One");
    put(2, "Two");
    put(3, "Three");
    put(4, "Four");
}};
System.out.println(hm.containsKey(4)); // Key 값 4 포함 여부 : true
System.out.println(hm.containsKey(5)); // Key 값 5 포함 여부 : false
System.out.println(hm.containsValue("Four")); // value 값 "Four" 포함 여부 : true
System.out.println(hm.containsValue("Five")); // value 값 "Five" 포함 여부 : false

--------------------------------------------------------------------------------------

// 두개의 해쉬맵이 같은지 비교하는 메소드
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
System.out.println(hm1.equals(hm3)); // 출력결과 : false
profile
백엔드 개발자 지망생

0개의 댓글