HashTable源码分析

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

posted @   刚刚好。  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示