충분히 쌓여가는
HashMap 본문
HashMap과 Hashtable - 순서 X, 중복(키X, 값O)
Map 인터페이스를 구현, 데이터를 키와 값의 쌍으로 저장
HashMap(동기화 X)은 Hashtable(동기화 O)의 신버전
HashMap
Map 인터페이스를 구현한 대표적인 컬렉션 클래스
순서를 유지하려면, LinkedHashMap 클래스를 사용하면 된다
TreeMap(≒ TreeSet)
범위 대상과 정렬에 유리한 컬렉션 클래스
HashMap보다 데이터 추가, 삭제에 시간이 더 걸림(비교하면서 저장하기 때문)
HashMap의 Key와 Value
Hashing 기법으로 데이터를 저장, 데이터가 많아도 검색이 빠르다
Map 인터페이스를 구현, 데이터를 key와 value의 쌍으로 저장
키(key) | 컬랙션 내의 키(key) 중에서 유일해야 한다 |
값(value) | 키(key)와 달리 데이터의 중복을 허용한다 |
비객체지향적인 코드 | 객체지향적인 코드 |
Object[] key; Object[] value; |
Entry[] table; class Entry { Object key; Object value; } |
해싱(hashing)
해쉬함수(hash function)로 해시테이블(hash table)에 데이터를 저장, 검색
해시 테이블은 배열과 링크드 리스트가 조합된 상태
해시 테이블에 저장된 데이터를 가져오는 과정
1. 키로 해시함수를 호출해서 해시코드를 얻는다
2. 해시코드(해시함수의 반환값)에 대응하는 링크드 리스트를 배열에서 찾는다
3. 링크드 리스트에서 키와 일치하는 데이터를 찾는다
※해시함수는 같은 키에 대해 항상 같은 해시코드를 반환해야 한다
서로 다른 키일지라도 같은 값의 해시코드를 반환할 수도 있다
HashMap 메서드
HashMap() |
HashMap(int initialCapacity) |
HashMap(int initialCapacity, float loadFactor) |
HashMap(Map m) |
Object put(Object key, Object value) |
void putAll(Map m) |
Object remove(Object key) |
Object replace(Object key, Object value) |
boolean replace(Object key, Object oldValue, Object newValue) |
Set entrySet() |
Set keySet() |
Collection values() |
Object get(Object key) |
Object getOrDefault(Object key, Object defaultValue) |
boolean containsKey(Object key) |
boolean containsValue(Object value) |
int size() |
boolean isEmpty() |
void clear() |
Object clone() |
코드
import java.util.*;
public class HashMapTest {
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 :");
String id = s.nextLine().trim();
System.out.print("password :");
String password = s.nextLine().trim();
System.out.println();
if(!map.containsKey(id)) {
System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");
continue;
}
if(!(map.get(id)).equals(password)) {
System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
} else {
System.out.println("id와 비밀번호가 일치합니다.");
break;
}
}
}
}
id와 password를 입력해주세요.
id :asdf
password :1111
비밀번호가 일치하지 않습니다. 다시 입력해주세요.
id와 password를 입력해주세요.
id :asdf
password :1234
id와 비밀번호가 일치합니다.
코드
import java.util.*;
public class HashMapTest2 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("김자바", 90);
map.put("김자바", 100);
map.put("이자바", 100);
map.put("강자바", 80);
map.put("안자바", 90);
// 4개만 저장됨(김자바 1개만 저장됨)
Set set = map.entrySet();
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);
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));
}
}
이름 : 안자바, 점수 : 90
이름 : 김자바, 점수 : 100
이름 : 강자바, 점수 : 80
이름 : 이자바, 점수 : 100
참가자 명단 : [안자바, 김자바, 강자바, 이자바]
총점 : 370
평균 : 92.5
최고점수 : 100
최저점수 : 80
코드
빈도 수 체크
import java.util.*;
public class HashMapTest3 {
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]);
map.put(data[i], value+1); // 기존에 존재하는 키면 기존 값을 1증가
} else {
map.put(data[i], 1); // 긱존에 존재하지 않는 키는 값을 1로 저장
}
}
Iterator it = map.entrySet().iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
int value = (int)entry.getValue();
System.out.println(entry.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