hash table은 배열로 구현되어있을텐데 특정 중간 value를 어떻게 삭제하나요?
각각의 요소는 linkedlist로 연결되어있지않은데 어떻게 중간값을 삭제하는게 가능한지 궁금합니다
public synchronized V remove(Object key) { // 키를 사용하여 값을 제거하는 함수
Hashtable.Entry<?, ?>[] tab = this.table; // 테이블의 배열을 가져옴
int hash = key.hashCode(); // 키의 해시 값을 계산함
int index = (hash & 2147483647) % tab.length; // 계산한 해시 값을 사용하여 배열에서 위치(인덱스)를 찾음
Hashtable.Entry<K, V> e = tab[index]; // 찾은 인덱스에서 연결 리스트(링크드 리스트)를 가져옴
for (Hashtable.Entry<K, V> prev = null; e != null; e = e.next) { // 해당 연결 리스트를 순회함
if (e.hash == hash && e.key.equals(key)) { // 만약 현재 요소의 키가 찾는 키와 같다면
if (prev != null) { // 이전 요소가 있다면 (첫 번째 요소가 아닌 경우)
prev.next = e.next; // 이전 요소가 현재 요소를 건너뛰고 다음 요소를 가리키게 함 (현재 요소를 리스트에서 제거)
} else {
tab[index] = e.next; // 첫 번째 요소를 제거하는 경우, 배열의 해당 인덱스를 다음 요소로 업데이트 함
}
// 값을 성공적으로 제거하였으므로, 변경 카운트와 요소 수를 업데이트하고, 제거된 값을 반환함
++this.modCount;
--this.count;
V oldValue = e.value;
e.value = null;
return oldValue;
}
prev = e; // 다음 반복을 위해 이전 요소를 현재 요소로 업데이트함
}
return null; // 찾는 키가 없는 경우 null을 반환함
}