열정 실천

[JAVA] Hash 자료구조 / 자바에서 Hashmap 사용하기 본문

CS/자료구조

[JAVA] Hash 자료구조 / 자바에서 Hashmap 사용하기

구운오니 2024. 9. 4. 15:09

 

🙄 해시테이블이란?

 

key - value 형태를 갖는 하나의 자료구조이다. 

 

ket : 무언가를 검색하기 위한 검색어 

value : 그 검색어로 나온 결과 

- 데이터가 저장되는 곳을 버킷, 슬롯이라고 한다. 

 

✨해시 테이블은 key-value가 1:1로 매핑되어있기 때문에 삽입, 삭제, 검새의 과정에서 모두 O(1)의 시간복잡도를 가진다. 

 

🙄 어떤 문제에서 Hash를 쓰는게 좋을까?

 

String을 기반으로 정보를 기록하고 관리해야 할 때 

 

예를 들어 학생 이름과 성적을 저장하고 검색해야 할때

배열을 쓴다면 2차원 배열을 이용해 0번째에는 이름 1번째에는 성적을 저장하고 학생이름으로 검색해 성적을 조회하려면 첫번재 요소부터 확인하며 해당이름을 찾아야한다. 

 

하지만 해시를 쓰면 이름(key 값)으로 바로 성적을 조회할 수 있다. 

 

 

🙄 좀 더 자세하게 알아볼까? 

 

 

 

👉 해시 함수 

 

임의의 길이의 데이터를 고정된 길이의 데이터로 매핑해주는 함수이다. (key------>hash)

키를 해시함수에 적용하여 나온 고정된 길이의 값을 해시 또는 해시값이라고 부른다. 

이 해시값은 데이터(value)가 저장되는 위치이다. 

 

👉 해시 충돌

 

서로 다른 key값을 해시함수에 넣었는데 같은 해시값이 나오는 경우를 해시충돌이라고 한다. 해시 충돌이 많아지면 데이터 저장시 비효율성도 커지고 보안이 취약해지기 때문에 발생 확률이 적을수록 좋다. 

 

 

 

HashMap in JAVA

 

해시테이블을 기반으로 구현된 자바의 컬랙션이다. 

위에서 설명한대로 Key-Value의 형태로 저장한다. key값을 통해서만 검색이 가능하다. 

⚠ key 값은 중복될 수 없고 value 값은 중복이 가능하다.

 

 

💻 선언 방법 

 

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지정

 

 

KEY 값은 String으로 VALUE 값은 Integer로 저장하고 싶다면? 

HashMap<String,Integer> map = new HashMap<String,Integer>();

 

💻 데이터 추가 

 

map.put("예원",100);

 

 

💻 데이터 반환

 

key값에 해당하는 value값 반환

map.get("예원");

 

이 함수를 사용하는데 만약 "예원"이라는 키를 가진 값이 없다면 오류가 난다.

이를 방지하기 위한 getOrDefault함수가 있다!

 

데이터가 없다면 default값 반환 / 있으면 데이터 반환

map.getOrDefault("예원",0);

-> "예원"에 해당하는 값이 있으면 그 값을 반환하고 데이터가 없으면 0을 반환한다. 

 

💻 데이터 삭제

 

key와 일치하는 기존 데이터 삭제

map.remove("예원");

 

모든 데이터 삭제 

map.clear();

 

 

💻 데이터 유무 확인

 

key값에 해당하는 데이터가 있는지 - 있으면 true 없으면 false

map.containsKey("예원");

 

 

 

 

💡Tip! 해시맵의 모든 key값과 value값을 추출하는 가장 쉬운 방법 

 

map.forEach((key, value) -> {
     System.out.println(key + " : " + value);
});