HashMap和HashTable的区别

HashMap和HashTable的区别
1、继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2、线程安全性不同
HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的-链表数组
假如A线程和B线程同时对同一个数组位置调用addEntry,两个线程会同时得到现在的头结点,然后A写入新的头结点之后,B也写入新的头结点,那B的写入操作就会覆盖A的写入操作造成A的写入操作丢失
4、key和value是否允许null值
Hashtable中,key和value都不允许出现null值
但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过
7、内部实现使用的数组初始化和扩容方式不同
HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1


HashTable使用synchronized来保证线程安全


CurrentHashMap:底层原理
CurrentHashMap相当于优化了HashTable的同步部分,其中有锁的数组,分别用于其中的一部分数据 多线程访问的是容器中的不同锁,线程之间就不会有那么高的锁竞争
结构:
Segment数组结构:可重入锁(ReentrantLock)
HashEntry数组结构:用于存储键值对数据
每个Segment守护者一个HashEntry数组里的元素
在元素操作时,不断的使用散列算法来定位Segment


方法:
get是不需要加锁的 因为他使用了volatile关键字 保证了读取的原子性 HashTable的读取是需要加锁的
put方法是需要枷锁的,首先定位到Segment 然后再Segment里面进行插入操作 插入之前先判断是否扩容,然后再操作,扩容是扩容成两倍
size 全聚德count被volatile修饰

 

posted @ 2021-01-07 23:20  发条良子  阅读(123)  评论(0)    收藏  举报