开发者社区> 问答> 正文

[@talishboy][¥20]hashmap hastable 底层实现什么区别?hashtable和concurrenthashtable呢?

hashmap hastable 底层实现什么区别?hashtable和concurrenthashtable呢?

展开
收起
月下丶 2018-12-14 23:59:48 3059 0
1 条回答
写回答
取消 提交回答
    1. hashmap 是线程不安全的,hashtable是线上安全的;
    2. hashtable 的线程完全是通过方法上加 synchroinzed 实现的;
    3. 没有 concurrenthashtable,存在concurrenthashmap;
    4. concurrenthashmap 是通过分段锁来保障线程安全的。

    ----- hashtable -----

    public synchronized V get(Object key) {
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                return (V)e.value;
            }
        }
        return null;
    }
    

    ------ concurrenthashmap -----

    public V get(Object key) {
        Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;
        int h = spread(key.hashCode());
        if ((tab = table) != null && (n = tab.length) > 0 &&
            (e = tabAt(tab, (n - 1) & h)) != null) {
            if ((eh = e.hash) == h) {
                if ((ek = e.key) == key || (ek != null && key.equals(ek)))
                    return e.val;
            }
            else if (eh < 0)
                return (p = e.find(h, key)) != null ? p.val : null;
            while ((e = e.next) != null) {
                if (e.hash == h &&
                    ((ek = e.key) == key || (ek != null && key.equals(ek))))
                    return e.val;
            }
        }
        return null;
    }
    2019-07-17 23:21:52
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载