Map 인터페이스를 구현하는 대표적인 컬렉션 클래스
해싱(hashing)기법으로 데이터를 저장. 데이터가 많아도 검색이 빠르다.
데이터를 키 & 값(key & value)의 쌍 = Entry[] 으로 저장
✨✨순서X, 중복(키X, 값O)
Hashmap(동기화X), Hashtable(동기화O, 구버전)의 신버전
순서를 유지하려면 LinkedHashMap
클래스를 사용!
해싱 : 해시함수 를 이용하여 데이터를 저장하고 읽어오는 것
해시 함수 : key를 받으면 해시함수가 해시코드를 알려준다.
해시 코드 : ✨저장위치, ✨배열의 index
예) 환자정보관리(연대별로 정보를 구분한 뒤, 주민번호를 받으면 해시함수가 7 이라는 해시코드를 알려준다.)
해싱기법 사용하는 클래스 : Hashtable, HashMap, HashSet
hashcode()
를 사용hashcode()
오버라이딩 방법??Objects.hash()
해시 함수 : key를 받으면 해시함수가 해시코드를 알려준다.
: ✨항상 같은 key를 받으면 같은 해시코드를 반환한다.
: 해시함수로 해시테이블에 데이터를 저장, 검색
💖💖Objects.hash()
를 사용하여 hashcode()
를 오버라이딩 한다.
HashMap map = new HashMap(); map.push("myID", "1234"); map.push("abcd", "1111"); map.push("abcd", "1234"); ... myID - 1234 abcd - 1234
map.push
HashMap()
HashMap(Map m)
HashMap(int initialCapacity)
HashMap(int initialCapacity, float loadFactor)
Object put(Object key, Object value)
void putAll(Map m)
Object remove(Object key)
void clear()
Object replace(Object key, Object value)
boolean replace(Object key, Object oldValue, Object newValue)
Set entrySet()
Map.Entry
타입의 객체✨로 저장한 Set으로 반환Set keySet()
Collection values()
boolean containsKey(Object key)
boolean containsValue(Object value)
Object get(Object key)
Object getOrDefault(Object key, Object defaultValue)
boolean isEmpty()
int size()
Object clone()
ex11_16
import java.util.HashMap;
import java.util.Scanner;
public class Ex11_16 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("myID", "1234");
map.put("asdf", "1111");
System.out.println(map);
map.put("asdf", "1234");
System.out.println(map);
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("id와 password를 입력해주세요.");
System.out.print("id : ");
String id = sc.nextLine().trim(); //String 앞뒤 공백제거
System.out.print("password : ");
String password = sc.nextLine().trim();
//***key일치 확인 : equals가 아닌 containsKey!!
//boolean equals(Object o) 맵과 o과 같은지 비교 이므로 안됨!!
if(!map.containsKey(id)) {
System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");
continue; //***반복문 끝으로 가고 다시 다음 반복으로
}
//*****key를 반환하고 난 다음에 해당 key의 짝꿍value비교!!!
//이럴땐 containsValue하면 안된다!!
//***value일치 확인 : key일치 확인 후 -> equals
if(!(map.get(id)).equals(password)) {
System.out.println("password가 일치하지 않습니다. 다시 입력해주세요.");
} else {
System.out.println("id와 password가 일치합니다.");
System.out.println("로그인 성공 ... WELCOME!!");
break; //반복문 나가기
}
}
}
}
ex11_17
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Ex11_17 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("김자바", new Integer(90));
map.put("김자바", new Integer(100));
map.put("이자바", new Integer(100));
map.put("강자바", new Integer(90));
map.put("안자바", new Integer(90));
System.out.println(map);
//***cf_06 iterator로 읽어오기
Set set = map.entrySet();
//***쌍으로
System.out.println(set);
Iterator it = set.iterator();
//아래는 위의 두줄을 줄인 것
//Iterator it = map.entrySet().iterator();
while(it.hasNext()) {
//*****이거 잘 모르겠다. 묶음entry로 받아야하는데
//Map인터페이스 내부의 Entry인터페이스
//인터페이스안에 선언된 내부클래스나 인터페이스는 모두 static이라 바로 호출 가능
//이전에 list와set에선 : Object obj = it.next();이렇게 받았는데 얜 Entry니까
//(Map.Entry)형변환이 필요하다.
Map.Entry e = (Map.Entry)it.next();
System.out.println("이름 : "+e.getKey()+", 점수 : "+e.getValue());
}
//***key들만
set = map.keySet();
System.out.println("참가자 명단 : "+set);
//***value들만(Collection)
Collection c = map.values();
System.out.println("점수 모음 : "+c);
it = c.iterator();
//아래는 위의 두줄을 줄인 것
//it = map.values().iterator();
int total = 0;
while(it.hasNext()) {
Integer i = (Integer) it.next();
total += i.intValue();
//int i = (int)it.next(); 해도됨. 오토박싱
//total += i;
}
System.out.println("총점 : "+total);
System.out.println("평균 : "+(float)total/set.size());
System.out.println("최고점수 : "+Collections.max(c));
System.out.println("최저점수 : "+Collections.min(c));
//**위의 max(), min()은 Comparable구현한 클래스객체만 들어올 수 있다!
}
}
{안자바=90, 김자바=100, 강자바=90, 이자바=100}
[안자바=90, 김자바=100, 강자바=90, 이자바=100]
이름 : 안자바, 점수 : 90
이름 : 김자바, 점수 : 100
이름 : 강자바, 점수 : 90
이름 : 이자바, 점수 : 100
참가자 명단 : [안자바, 김자바, 강자바, 이자바]
점수 모음 : [90, 100, 90, 100]
총점 : 100
평균 : 25.0
최고점수 : 100
최저점수 : 90
ex11_18
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Ex11_18 {
public static void main(String[] args) {
String[] data = { "A","K","A","K","D","K","A","K","K","K","Z","D" };
HashMap map = new HashMap();
for(int i=0; i<data.length; i++) {
if(map.containsKey(data[i])) {
int value = (int)map.get(data[i]);
//get(Object key) : key에 대응하는 ***value반환이다***
//**** 있으면 +1
map.put(data[i], value+1);
}else {
map.put(data[i], 1);
}
}
//Set set = map.entrySet();
Iterator it = map.entrySet().iterator();
while(it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
int value = (int) e.getValue();
System.out.println(e.getKey()+" : "+printBar('#', value)+" "+value);
}
}
public static String printBar(char ch, int value) {
char[] bar = new char[value];
for(int i=0; i<bar.length; i++)
bar[i] = ch;
return new String(bar);
//***String(char[] chArr) 라는 생성자가 있음!!!
}
}
A : ### 3
D : ## 2
Z : # 1
K : ###### 6