키 값의 연산에 의해 직접 접근이 가능한 데이터 구조
해싱은 해시 함수에서 해시를 출력하고, 해시 테이블에 저장하는 과정까지의 행위
https://github.com/Si-Hyeak-KANG/java_algorithm/blob/master/src/dataStructureSudy/base01/Hash.java
public static void main(String[] args) {
Hash myHash = new Hash(20);
myHash.saveData("Lee","30000");
myHash.saveData("James","15000");
myHash.saveData("Denny","5000");
System.out.println(myHash.getData("Lee"));
System.out.println(myHash.getData("James"));
System.out.println(myHash.getData("Denny"));
}
30000
15000
5000
HashTable은 JDK 1.0부터 있던 Java의 API이고,
HashMap은 Java 2에서 처음 선보인 Java Collections Framework에 속한 API이다.
HashTable은 구현에 거의 변화가 없는 반면, HashMap은 지속적으로 개선되고 업데이트 되고 있다고 한다.
따라서 왠만하면 HashMap을 사용하고, 멀티스레드 환경에서는 ConcurrentHashMap를 사용하는게 좋습니다.
HashMap, Hashtable 모두 Map 인터페이스를 구현한 클래스이기 때문에 아래와 같이 Map형으로 선언할 수 있습니다.
HashMap<String,Integer> hashMap = new HashtMap<>();
Hashtable<String,Integer> hashtalbe = new Hashtable<>();
Map<String,Integer> map1 = new HashtMap<>();
Map<String,Integer> map2 = new Hashtable<>();
put() : 값 넣기
Map<String,Integer> map = new HashMap<>();
map.put("A", 1);//{A=1}
map.put("B", 3);//{A=1, B=3}
map.putIfAbsent("C", 5);//{A=1, B=3, C=5}
map.putIfAbsent("C", 7);//{A=1, B=3, C=5}
//{A=1, B=3, C=5}
int a = map.get("A"); //a = 1
int e = map.getOrDefault("E",-1); //e = -1
System.out.println(map.keySet()); //[A, B, C]
System.out.println(map.values()); //[1, 3, 5]
//{A=2, B=4, C=10}
map.remove("A");// {B=4, C=10}
map.remove("C", 11); //{B=4, C=10}
map.remove("C", 10); //{B=4}
//{A=1, B=3, C=5}
map.replace("B", 4); //{A=1, B=4, C=5}
map.replace("C",6); //{A=1, B=4, C=6}
map.replace("C",6,10); //{A=1, B=4, C=10}
map.replace("C",6,12 ); //{A=1, B=4, C=10} => C=6이 아니기때문에 값은 그대로.
map.put("A",2); //{A=2, B=4, C=10}
//{A=1, B=3, C=5}
System.out.println(map.containsKey("A")); //true
System.out.println(map.containsValue("5")); //true
System.out.println(map.containsValue("7")); //false
해시에서는 입력받은 키의 첫 번째 문자를 배열의 크기로 나눈 나머지를 인덱스로 사용합니다.
만약 다른 키가 있는데 이 키의 첫 번째 문자가 동일핟다면, 인덱스는 동일하게 반환될 것이니다.
그럼 배열에서 같은 장소에 저장되고, 이전에 저장된 정보는 사라질 것입니다.
이를 충돌이 발생했다고 하는데요. 또는 Collision이라고 합니다.
Chaining 기법을 구현한 코드
https://github.com/Si-Hyeak-KANG/java_algorithm/blob/master/src/dataStructureSudy/base01/Hash_Chaining.java
Linear Probing 기법은 해시 함수를 통해서 얻은 주소(인덱스)에 이미 데이터가 있다면, 다음 주소를 체크합니다. 만약 체크했을 때 데이터가 없다면, 해당 자리에 저장이 됩니다.
Linear Probing 기법을 구현한 코드
https://github.com/Si-Hyeak-KANG/java_algorithm/blob/master/src/dataStructureSudy/base01/Hash_LinearProbing.java