2023. 5. 17. 11:10ㆍ자바

Map인터페이스를 구현하여 데이터를 키와 값의 쌍으로 자료구조이다.
Map이라는 인터페이스를 구현하여 Hashtable, HashMap, SortedMap 등을 사용한다.
순서를 보장하지 않고
키는 중복을 허용하지 않고, 값은 중복을 허용한다.
여기서 HashMap은 Map 인터페이스를 구현한 대표적인 컬렉션 클래스입니다.
만약 순서를 유지하고 싶다면 LinkedHashMap 클래스를 사용하면 됩니다.
TreeMap은 범위 검색, 정렬에 유리한 컬렉션 클래스로 HashMap보다 데이터 추가, 삭제에 시간이 더 걸립니다. (정렬을 할 때 비교하며 저장을 해야 하기 떄문이다)
HashMap에서는 해싱 기법으로 데이터를 저장을 해서 데이터가 많아도 검색이 빠르다는 장점이 있습니다.
해싱이란?
해시함수로 해시테이블에 데이터를 저장, 검색하는 방법을 말합니다.

해시함수에 키값을 넣으면 해시코드를 반환하게 되는데 해시코드는 배열의 index입니다.
해시테이블은 배열 + 링크드리스트로 구성되어 있는데 이유는 배열과 링크드리스트의 장점을 모두 활용하기 위해서입니다. 배열은 index가 존재하기 때문에 빠르게 접근할 떄 유리합니다. 링크드리스트는 변경할 때 유리합니다.
해시테이블에서 저장된 데이터를 가져오는 과정은 다음과 같습니다.
1. 키로 해시함수를 호출해서 해시코드를 얻는다.
2. 해시코드(해시함수의 반환값)에 대응하는 링크드리스트를 배열에서 찾는다.
3. 링크드리스트에서 키와 일치하는 데이터를 찾는다.
참조 : 해시함수는 같은 키에 대해 항상 같은 해시코드를 반환해야 합니다.
서로 다른 키일지라도 같은 값의 해시코드를 반환할 수도 있다.
HashMap의 주요 생성자 / 메소드
HashMap() : HashMap 객체를 생성
HashMap(int initailCapacity) : 지정된 값을 초기용량으로 하는 HashMap 객체 생성
HashMap(Map m) : 지정된 Map의 모든 요소를 포함하는 HashMap을 생성
Object put(Object key, Object value) : 추가
void putAll(Map m) : Map에 있는 데이터 저장
Object remove(Object key) : 삭제
Object replace(Object key, Object value) : 주어진 키의 값을 변경
Set entrySet() : entry로 이루어진 Set을 가져온다.
Set keySet() : key로 이루어진 Set을 가져온다.
Collection values() : 값만 가져온다.
Object get(Object key) : key에 해당하는 값을 가져온다.
Object getOrDefault(Object key, Object defaultValue) : key에 해당하는 값이 없으면 defaultvalue를 가져온다.
boolean containsKey(Object key) : 해당 key값이 있는지 검사
boolean containsValue(Object value) : 해당 값이 있는지 검사
int size() : 사이즈
boolean isEmpty : 비었는지 검사
void clear : 전부 삭제
Object clone : 복제
예제
import java.util.HashMap;
import java.util.Scanner;
public class HashMapEx1 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("myid", "1234");
map.put("asdf", "1111");
// 동일한 키값이 들어오면 값이 수정된다.
map.put("asdf", "1234");
Scanner s = new Scanner(System.in);
while (true) {
System.out.println("id와 password를 입력해주세요.");
System.out.print("id : ");
// trim 사용시 띄어쓰기를 제거해준다.
String id = s.nextLine().trim();
System.out.print("password : ");
String password = s.nextLine().trim();
// hashmap 안에 key값이 존재하는지 검사
if (!map.containsKey(id)) {
System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요");
continue;
}
// value가 같은지 검사
if (!map.get(id).equals(password)) {
System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
} else {
System.out.println("id와 비밀번호가 일치합니다.");
break;
}
}
}
}
import java.util.*;
public class HashMapEx2 {
public static void main(String[] args) {
HashMap map = new HashMap();
// map에 key, value 입력
map.put("김자바", 100);
map.put("이자바", 100);
map.put("강자바", 80);
map.put("안자바", 90);
// 키, 값 가져오기
Set set = map.entrySet();
System.out.println("entrySet 출럭 : " + set);
Iterator it = set.iterator();
while (it.hasNext()) {
Map.Entry e = (Map.Entry) it.next();
System.out.println("이름 : " + e.getKey() + ", 점수 : " + e.getValue());
}
// 키만 가져오기
set = map.keySet();
System.out.println("참가자 명단 : " + set);
// map에 저장된 값만
Collection values = map.values();
it = values.iterator();
int total = 0;
while (it.hasNext()) {
int i = (int) it.next();
total += i;
}
System.out.println("총점 : " + total);
System.out.println("평균 : " + (float)total / set.size());
System.out.println("최고점수 : " + Collections.max(values));
System.out.println("최저점수 : " + Collections.min(values));
}
}
'자바' 카테고리의 다른 글
| 자바 람다 정리(자바의 정석) (0) | 2023.05.29 |
|---|---|
| 어노테이션 정리(자바의 정석) (0) | 2023.05.22 |
| enum 정리(자바의 정석) (0) | 2023.05.21 |
| 제네릭 정리 (자바의 정석) (0) | 2023.05.20 |
| 자바 문자열 (0) | 2023.04.25 |