HashMap,HashTable,ConcurrentHash的共同点和区别
HashMap
·底层数组+链表实现, ·可以存储null键和null值, ·线程不安全 ·默认大小: 16, 增长因子:0.75;扩容点规则(什么时候扩容): 160.75=12;扩容方法:扩容为原来的2倍 ·扩容:newsize = oldsize2,size一定为2的n次幂 ·扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入 ·插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容) ·当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀 ·计算index方法:index = hash & (tab.length – 1)
HashTable
·底层数组+链表实现, ·key还是value都不能为null, ·线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 ·默认大小: 11, 增长因子:0.75;扩容点规则(什么时候扩容): 110.75=12,扩容方法:扩容为原来的2倍+1 ·扩容:newsize = olesize2+1 ·计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length
ConcurrentHashMap
·底层结构是散列表(数组+链表)+红黑树,这一点和HashMap是一样的。 ·ConcurrentHashMap的key和Value都不能为null ·Hashtable是将所有的方法进行同步,效率低下。而ConcurrentHashMap作为一个高并发的容器,它是通过部分锁定+CAS算法来进行实现线程安全的。CAS算法也可以认为是乐观锁的一种~ ·在高并发环境下,统计数据(计算size...等等)其实是无意义的,因为在下一时刻size值就变化了。 ·get方法是非阻塞,无锁的。重写Node类,通过volatile修饰next来实现每次获取都是最新设置的值
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。