Java集合-HashTable

之前分析過(guò)HashMap的結(jié)構(gòu),接下來(lái)簡(jiǎn)單的分析一下HashTable的數(shù)據(jù)結(jié)構(gòu)和線程安全的實(shí)現(xiàn)。

HashTable
!

HashTable實(shí)現(xiàn)上與HashMap實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)相似,先看HashTable定義:

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

它實(shí)現(xiàn)了Map接口,與HashMap不一樣的是,他繼承了Dictionary。那么接下來(lái)看一下他的主要成員變量:

private transient Entry<K,V>[] table;
private transient int count;
private int threshold;
private float loadFactor;

與HashMap類似,他擁有一個(gè)hash的表table數(shù)組,同時(shí)定義了裝載因子loadFactor,初始化桶容量threshold,接下來(lái)看一下HashTable重寫(xiě)的Entry:

private static class Entry<K,V> implements Map.Entry<K,V> {
    int hash;
    final K key;
    V value;
    Entry<K,V> next;
    ...
}

與HashMap類似的他將Entry定義為一個(gè)存儲(chǔ)key-map的鏈表結(jié)構(gòu)。那么我們可以繼續(xù)仿照HashMap去理解HashTable的結(jié)構(gòu)。

接下來(lái),我們看一下HashTable中的put方法:

public synchronized V put(K key, V value) {
    // Make sure the value is not null
    if (value == null) {
        throw new NullPointerException();
    }

    // Makes sure the key is not already in the hashtable.
    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 the table if the threshold is exceeded
        rehash();

        tab = table;
        hash = hash(key);
        index = (hash & 0x7FFFFFFF) % tab.length;
    }

    // Creates the new entry.
    Entry<K,V> e = tab[index];
    tab[index] = new Entry<>(hash, key, value, e);
    count++;
    return null;
}

第一眼看上去,好長(zhǎng),而且在一個(gè)方法內(nèi)實(shí)現(xiàn)了大部分的邏輯,可以看出,HashTable在實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)層面上沒(méi)有HashMap的精煉,算法層面上也沒(méi)有HashMap寫(xiě)的優(yōu)。一部分原因是這部分代碼實(shí)現(xiàn)在JDK1.0中,另一方面,是為了保持操作的原子性,保證線程安全??梢钥吹?,HashTable在實(shí)現(xiàn)線程安全方面,通過(guò)將讀寫(xiě)操作代碼整合在一個(gè)方法中,通過(guò)synchronized來(lái)達(dá)到線程互斥,保證線程安全。
那么看一下HashTable中還有哪些通過(guò)synchronized聲明的方法:

synchronized void                clear()
synchronized Object              clone()
synchronized boolean             contains(Object value)
synchronized boolean             containsKey(Object key)
synchronized boolean             containsValue(Object value)
synchronized Enumeration<V>      elements()
synchronized Set<Entry<K, V>>    entrySet()
synchronized boolean             equals(Object object)
synchronized V                   get(Object key)
synchronized int                 hashCode()
synchronized boolean             isEmpty()
synchronized Set<K>              keySet()
synchronized Enumeration<K>      keys()
synchronized V                   put(K key, V value)
synchronized void                putAll(Map<? extends K, ? extends V> map)
synchronized V                   remove(Object key)
synchronized int                 size()
synchronized String              toString()
synchronized Collection<V>       values()

通過(guò)分析put方法大致發(fā)現(xiàn)了HashTable在實(shí)現(xiàn)線程安全方面采取了一些有別于HashMap的方式,其他的方法可以大致參考HashMap的解釋,就懶一下,不分析了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,706評(píng)論 18 399
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,896評(píng)論 0 11
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,803評(píng)論 11 349
  • 哪一顆星沒(méi)有光 哪一朵花沒(méi)有香 哪一次我的思潮里 沒(méi)有你波濤的清響 哪一天 哪一天 我的親愛(ài) 你不再憂傷 哪一天...
    玢芬美藏閱讀 367評(píng)論 0 4
  • 當(dāng)提到品位的時(shí)候 我腦中不由自主地想到的事情可能是 點(diǎn)著香薰,拿著紅酒,放著藍(lán)調(diào) 捧著一本莎士比亞選集 “啥品位啊...
    呱聊閱讀 613評(píng)論 0 3

友情鏈接更多精彩內(nèi)容