1.HashMap与concurrenthashmap的区别
hashmap:
- 是基于哈希表的Map接口实现,此实现提供所有可选的映射操作,并允许null值,null键,hashmap本质是数组加链表,根据key取hash值,然后计算出数组下标,如果多个key对应同一个下标,就用链表串起来,新插入的再前面。
还有一点需要注意,hashMap不是线程安全的,如果想要相乘安全的HashMap,可以通过Collections的静态方法synchronizedMap获得线程安全的HashMap。
HashMap的数据结构
HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快查询速度主要是因为他是通过计算散列值码来决定存储的位置,能够很快的计算出对象存储的位置,HashMap中主要是通过key的hashCode来计算hash值,只要hashcode相同,计算出来的hash值一样
ConcurrentHashMap
为什么要使用ConcurrentHashMap
再并发编程中,jdk1.7的情况下HashMp可能会造成死循环,而jdk1.8中有可能会造成数据丢失
ConcurrentHashMap:在hashMap的基础上,ConcurrentHashMap将数据分为多个segment(段),默认16个,然后每次操作对一个segmen段加锁,避免多线程锁的几率,提高并发效率
HashMap与ConcurrentHashMap区别总结
hashMap
- 底层数组+链表结构,可以存储null键与null值,线程不安全
- 初始size1*****6,扩容:newsize=oldsize*2,size一定为2的n次幂
- 扩容是针对整个Map,每次扩容,原来数组中的元素依次重新计算存放位置,并插入数据
- 当Map中元素晁错Entry中的75%就会触发扩容
HashMap的初始值还要考虑加载因子:
- 哈希冲突:若干key的哈希值按数组大小取模后,如果落在同一个数组下标上,将组成一条Entry链,对key的查找需要遍历Entry链上的每个元素执行equals()比较
- 加载因子:为来降低哈希冲突,默认HashMap中的键值对达到75%时会触发扩容
- 空间换时间:如果希望加快key查找时间,还可以就进一步降低加载因子,加大初始大小,降低哈希冲突
CconcurrentHashMap
底层采用分段的数组+链表实现,线程安全
通过整个Map分为N个Segment,可以提供线程安全,但是效率提升N倍,默认提升16倍
HashTable的synchronized是针对整张Hash表的,即每次锁住整张表,让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术
2.HashMap的put方法有返回值吗?
分为两种情况:
当key之前不存在的时候,会返回null,
当key之前存在,put进入新值的时候,会把之前的值返回出来