HashTable源码分析

发布时间 2023-03-26 20:44:26作者: 刚刚好。

HashTable是一个线程安全的HashMap,是jdk早期版本的产物,但其效率较低

1.初始化

可以看到,与HashMap不同,HashTable无参构造是默认会构造一个容量为11的数组,而HashMap在无参构造初始化时不会构造数组,只有在第一个put后才会构造容量为16的数组

2.put方法

与CurrentHashMap不同,HashTable的处理方法比较粗暴,直接在put方法上加锁,而CurrentHashMap是采用CAS或者对操作的节点对象加锁

HashTable不允许key或value为空,而HashMap可以,下面是HashMap的代码

static final int hash(Object key) {
        int h;
    	//如果key为NULL那么哈希值为0
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

此外,HashTable的底层是数组+链表,当哈希冲突时,只采用链表的方式,而HashMap是树组+链表+红黑树

其他方法大致相同,就不分析了

总结

1.HashTable无参构造在初始化时就创建一个长度11的数组,而HashMap无参构造在第一次put后创建长度为16的数组
2.HashTable不允许key和value为空,而HashMap可以
3.HashTable底层为数组+链表,而HashMap底层为数组+链表+红黑树
4.HashTable解决线程安全的方法是在put等方法上添加synchronized,锁住的是整个HashTable,而CurrentHashMap则是对操作的节点采用CAS或synchronized