HashMap과 HashSet은 Hashtable - 검색속도 최고(중복x, 순서x)
TreeSet과 TreeMap은 R-BT - 항상 정렬된 상태를 유지(범위 검색은 이게 빠르다)
*Hashtable
배열에서 찾고자 하는 값이 있을 때 한번에 접근 가능
해싱(hashing): 데이터를 가급적 고유한 수의 값으로 표현하는 작업
해시함수(hash function) : 데이터로부터 고유한 수의 값을 계산하는 함수
*해시함수(hash function)
해시 값을 배열의 인덱스로 사용해서 key값을 저장
해시 테이블의 버킷(bucket)에 저장
*해싱
만약 해시테이블의 크기가 7인 경우 7로 나눈 나머지 값을 구한다.
7로 나눈 나머지 값이 0인 경우 0번째 방에 간다. 정렬된 상태가 유지되지 않는다.
만약 92라는 원소를 추가하는경우? a[1] 버킷에 이미 키값이 저장되어 있기 때문에 충돌(collision)발생
HashMap은 Map을 구현했으므로 Map의 특징, 키(key)와 값을(value)을 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다. 그리고 해싱을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.
서로 관련된 값이기 때문에 하나의 클래스로 정의해서 하나의 배열로 다루는 것이 더 바람직하다.
import java.util.HashMap;
import java.util.Scanner;
public class H1 {
public static void main(String[] args) {
HashMap<String, String> user = new HashMap<>();
user.put("user1", "password123");
user.put("user2", "securePass456");
user.put("admin", "adminPass789");
// System.out.println(user.get("user1"));//key값이 존재하는 경우는 value 값을 얻는다.
// System.out.println(user.get("user2"));
// System.out.println(user.get("admin"));
// System.out.println(user.get("user3"));//key값이 없는 경우 null을 리턴
Scanner in = new Scanner(System.in);
System.out.print("검색할 아이디 입력 : ");
String userId = in.nextLine();
if(user.get(userId) == null) {//key로 얻어온 value가 null이라면?
System.out.println("검색한 아이디는 존재하지 않습니다.");
}else {
System.out.println("검색한 [" + userId + "]의 패스워드는 [" + user.get(userId) + "]입니다.");
}
in.close();
}
}
import java.util.Collection;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
public class _03_WordQuiz {
public static void main(String[] args) {
HashMap<String, String> hm = new HashMap<>();
Scanner in = new Scanner(System.in);
hm.put("사과", "apple");
hm.put("바나나", "banana");
hm.put("오렌지", "orange");
hm.put("딸기", "strawberry");
hm.put("배", "pear");
Set<String> keySet = hm.keySet();//HashMap에서 key값을 담은 집합
System.out.println(keySet);
Collection<String> valueCol = hm.values();//타입이 다르다.
System.out.println(valueCol);
Map.Entry는 Map에 저장되는 모든 key-value쌍을 다루기 위해 내부적으로 Entry인터페이스를 정의해 놓은 것이다.
Map.keySet()은 각 key에 대해 value값을 얻으려고 하고
Map.entrySet은 getKey()와 getValue()메서드를 이용하여 접근할 수 있다.
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
// HashMap 생성
Map<String, Integer> studentScores = new HashMap<>();
// 데이터 추가
studentScores.put("Alice", 90);
studentScores.put("Bob", 85);
studentScores.put("Charlie", 95);
// 데이터 조회
System.out.println("Alice의 점수: " + studentScores.get("Alice"));
// 키 존재 여부 확인
if (studentScores.containsKey("Bob")) {
System.out.println("Bob의 점수: " + studentScores.get("Bob"));
} else {
System.out.println("Bob은 점수가 없습니다.");
}
System.out.println();
// 전체 데이터 출력
System.out.println("전체 학생 및 점수");
System.out.println(studentScores);
System.out.println();
for(String key : studentScores.keySet()) {
//System.out.println("key: " + key);
//System.out.println("value: " + studentScores.get(key));
System.out.println(key + ": " + studentScores.get(key));
}
//-----------------------------------------------------------------------//
System.out.println();
System.out.println("map.keySet() 사용");
Map<String, String> hashMap = new HashMap<>();
for (String key : studentScores.keySet()) {
System.out.println(key + ": " + studentScores.get(key));
}
//-----------------------------------------------------------------------//
System.out.println();
System.out.println("Map.entrySet 사용");
for (Map.Entry<String, Integer> entry : studentScores.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
'JavaStudy' 카테고리의 다른 글
| [Java] Anonymous(익명클래스) (0) | 2023.12.11 |
|---|---|
| [Java] TreeMap (1) | 2023.12.08 |
| [Java] TreeSet (0) | 2023.12.06 |
| [Java] HashSet, Iterator (0) | 2023.12.06 |
| [Java] LinkedList (0) | 2023.12.05 |