동일하지 않은 어떤 객체 X와 Y가 있을 때, 즉 X.equals(Y)가 '거짓'일 때 X.hashCode() != Y.hashCode()가 같지 않다면, 이때 사용하는 해시 함수는 완전한 해시 함수(perfect hash functions)라고 한다.
*X.equals(Y)* 가 성립하지 않는 서로 다른 객체에 대해 hashcode() 의 결과값이 동일하지 않은 경우 이 때 사용되는 해시 함수를 우린 **완전한 해시 함수(perfact hash funcitons)**라고 합니다.
int index = X.hashCode() % M; 공식을 통해 객체가 삽입될 버킷이 정해집니다.
동일 index에 대해서 데이타를 저장하는 자료 구조는 Linked List 뿐 아니라, Tree를 이용하여 저장함으로써, select의 성능을 높일 수 있다. 실제로, JDK 1.8의 경우에는 index에 노드가 8개 이하(static final int UNTREEIFY_THRESHOLD = 6;)일 경우에는 Linked List를 사용하며, 8개 이상(static final int TREEIFY_THRESHOLD = 8;)으로 늘어날때는 Tree 구조로 데이타 저장 구조를 바꾸도록
되어 있다.

oldCap << 1 연산을 통해 2배로 증가시킵니다.
static final int *DEFAULT_INITIAL_CAPACITY* = 1 << 4; // aka 16 , static final int *MAXIMUM_CAPACITY* = 1 << 30; 구문을 통해 확인할 수 있습니다.index = X.hashCode() % M을 계산할 때 사용하는 M 값은 소수일 때 가장 균등한 분포를 갖습니다. 아닌 경우라면 보조 해시 함수를 사용해 키의 해시 값을 변경해 해시 충돌 가능성을 낮춥니다.