记录下搜到的答案: 1.分段锁:容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。 2.HashMap 底层数据结构:jdk1.8的HashMap底层是数组、链表、红黑树。HashMap通过key的hashCode经过扰动函数处理后得到hash值,然后通过(n-1)&hash判断当前元素存放的位置(n是指当前数组的长度,在初始化一个HashMap的时候,如果是无参构造函数,则规定这个HashMap数组的长度为16,0-15,;如果为hashmap提供了长度,在经过函数tableSizeFor处理后,变成大于等于它的一个最小2**n,数组容量不足时,会扩充,数组扩充因素为0.75,每当数组容量达到当前数组容量的最大容量*0.75时,这个数组就会扩容一倍。数组的最大容量为2的30次方,),如果当前位置存在元素的话,就判断该元素的hash值以及key是否相同,如果相同的话,直接覆盖,否者,就通过拉链法解决冲突。当链表长度大于阈值(8)时,会调用treeifyBin方法。如果大于等于阈值,就会将链表转化为红黑树,当红黑树中节点小于等于6时,会转换为链表(只有数组长度大于等于64的情况下,才会执行链表与红黑树的转换,否者只是执行resize方法对数组扩充)。首次put时,会判断是否为第一次put,如果为第一次put,会先进行hashmap的初始化,然后存入数据,最后判断是否要进行扩充。不是第一次时,先存入数据,在判断是否要进行扩充