자바 기초 - HashTable 소스 코드 분석
자바 기초 - HashTable 소스 코드 분석
이 글 은 다음 과 같은 내용 을 포함 하고 있 습 니 다. 왼쪽 상단 + 번 호 를 클릭 하여 디 렉 터 리 를 펼 치 십시오.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable{}
HashTable 은 HashMap 과 마찬가지 로 링크 산열 의 데이터 구조 입 니 다. 소스 코드 에서 알 수 있 듯 이 Hashtable 은 Dictionary 류 에 계승 되 어 Map, Cloneable, Serializable 인 터 페 이 스 를 실현 합 니 다.
2. Hashtable 멤버 변수
Hashtable 은 모두 4 개의 구조 방법 을 제공 합 니 다.
4. Hashtable 저장 소
public synchronized V put(K key, V value) {
// value null
if (value == null) {
throw new NullPointerException();
}
// key hashtable
// , hash key , index , table[]
// , index , key, value, value
Entry tab[] = table;
int hash = hash(key);
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
V old = e.value;
e.value = value;
return old;
}
}
modCount++;
if (count >= threshold) {
// , rehash
rehash();
tab = table;
hash = hash(key);
index = (hash & 0x7FFFFFFF) % tab.length;
}
// , null
Entry<K,V> e = tab[index];
// Entry , Entry Hashtable index , e Entry
tab[index] = new Entry<>(hash, key, value, e);
count++;
return null;
}
저장 프로 세 스 는 다음 과 같 습 니 다.
5. Hashtable 획득
public synchronized V get(Object key) {
Entry tab[] = table;
int hash = hash(key);
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return e.value;
}
}
return null;
}
가 져 오 는 절 차 는 다음 과 같 습 니 다:
6. Hashtable 스 트 리밍 방식
Hashtable 은 네 가지 스 트 리밍 방식 이 있 습 니 다.
//1、 keys()
Enumeration<String> en1 = table.keys();
while(en1.hasMoreElements()) {
en1.nextElement();
}
//2、 elements()
Enumeration<String> en2 = table.elements();
while(en2.hasMoreElements()) {
en2.nextElement();
}
//3、 keySet()
Iterator<String> it1 = table.keySet().iterator();
while(it1.hasNext()) {
it1.next();
}
//4、 entrySet()
Iterator<Entry<String, String>> it2 = table.entrySet().iterator();
while(it2.hasNext()) {
it2.next();
}
7. Hashtable 과 HashMap 의 차이
Hashtable
HashMap
방법 은 동기 화 된 것 이다.
방법 은 비동기 적 이다
사전 클래스 기반
추상 맵 기반, 추상 맵 기반 맵 인터페이스 구현
key 와 value 는 null 로 허용 되 지 않 습 니 다. null 을 만나면 NullPointer Exception 으로 돌아 갑 니 다.
key 와 value 는 모두 null 로 허용 되 며, key 가 null 일 때 putForNullKey 방법 으로 처리 되 며, value 는 처리 되 지 않 았 습 니 다.
hash 배열 의 기본 크기 는 11 이 고 확장 방식 은 old * 2 + 1 입 니 다.
hash 배열 의 기본 크기 는 16 이 고 반드시 2 의 지수 입 니 다.
8. 다 중 스 레 드 에 존재 하 는 문제점
//Collections.synchronizedMap(Map<K, V>)
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
return new SynchronizedMap<K,V>(m);
}
private static class SynchronizedMap<K,V> implements Map<K,V>, Serializable {
private static final long serialVersionUID = 1978198479659022715L;
private final Map<K,V> m; // Backing Map
//
final Object mutex; // Object on which to synchronize
SynchronizedMap(Map<K,V> m) {
if (m==null)
throw new NullPointerException();
this.m = m;
// this , .
mutex = this;
}
SynchronizedMap(Map<K,V> m, Object mutex) {
this.m = m;
this.mutex = mutex;
}
public int size() {
synchronized(mutex) {return m.size();}
}
// map emty
public boolean isEmpty() {
synchronized(mutex) {return m.isEmpty();}
}
public boolean containsKey(Object key) {
synchronized(mutex) {return m.containsKey(key);}
}
public boolean containsValue(Object value) {
synchronized(mutex) {return m.containsValue(value);}
}
public V get(Object key) {
synchronized(mutex) {return m.get(key);}
}
public V put(K key, V value) {
synchronized(mutex) {return m.put(key, value);}
}
public V remove(Object key) {
synchronized(mutex) {return m.remove(key);}
}
public void putAll(Map<? extends K, ? extends V> map) {
synchronized(mutex) {m.putAll(map);}
}
public void clear() {
synchronized(mutex) {m.clear();}
}
private transient Set<K> keySet = null;
private transient Set<Map.Entry<K,V>> entrySet = null;
private transient Collection<V> values = null;
// keySet
public Set<K> keySet() {
synchronized(mutex) {
if (keySet==null)
//mutex SynchronizedSet, set .
keySet = new SynchronizedSet<K>(m.keySet(), mutex);
return keySet;
}
}
public Set<Map.Entry<K,V>> entrySet() {
synchronized(mutex) {
if (entrySet==null)
entrySet = new SynchronizedSet<Map.Entry<K,V>>(m.entrySet(), mutex);
return entrySet;
}
}
public Collection<V> values() {
synchronized(mutex) {
if (values==null)
values = new SynchronizedCollection<V>(m.values(), mutex);
return values;
}
}
public boolean equals(Object o) {
synchronized(mutex) {return m.equals(o);}
}
public int hashCode() {
synchronized(mutex) {return m.hashCode();}
}
public String toString() {
synchronized(mutex) {return m.toString();}
}
private void writeObject(ObjectOutputStream s) throws IOException {
synchronized(mutex) {s.defaultWriteObject();}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.