![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试
文章平均质量分 65
巧了,我就是酷
这个作者很懒,什么都没留下…
展开
-
ConcurrentHashMap 1.8源码详解
ConcurrentHashMap 1.8源码详解一、jdk1.8容器初始化一、jdk1.8容器初始化//没有进行任何操作,在添加数据时才会创建数组 public ConcurrentHashMap() { }//initialCapacity:指定数组初始长度(创建出的数组长度不是这个值)public ConcurrentHashMap(int initialCapacity) { if (initialCapacity < 0) thro原创 2021-11-15 22:44:06 · 596 阅读 · 0 评论 -
很多博文都是错的,ConcurrentHashMap的容量为什么是2的n次幂
归根到底,是为了提高计算的效率,而不是很多博文说的使散列表分布更加均匀。在jdk1.8中ConcurrentHashMap的数据结构为数组+链表+红黑树在插入新数据时,要确定插入的索引位置。同样,在数组扩容时,旧数据需要迁移到新数组中,其中,有的数据的位置可能会发生变化。下面就从插入数据时确定索引位置和迁移数据确定索引位置两个方面来讲。1.1插入数据插入数据时,先根据key的hashCode()计算出hash值,再通过一个扰动算法使hash值的高十六位与低十六位都参与进计算,尽可能的使散列表分布均原创 2021-11-13 20:55:29 · 1194 阅读 · 1 评论 -
计数统计为啥用LongAdder,LongAdder源码讲解
LongAdder源码讲解一、在Jdk1.8中,为什么不使用AtomicLong这种原子类型来计数二、在高并发情况下,LongAdder如何解决性能的问题?三、LongAdder源码解析一、在Jdk1.8中,为什么不使用AtomicLong这种原子类型来计数public final long incrementAndGet() { //this:当前对象 //valueOffset:当前对象的偏移量 //根据当前对象和偏移量可以获取到内存中的值 return unsafe.g原创 2021-11-11 18:04:09 · 371 阅读 · 0 评论 -
常见的四个map实现类
原创 2021-10-11 19:48:08 · 250 阅读 · 0 评论 -
为什么重写equals还要重写hashcode?怎么重写hashcode?
为什么重写equals还要重写hashcode?怎么重写hashcode? 一、hash表的存储方法?二、为什么重写equals时还要重写hashcode?三、怎么重写hashcode()?一、hash表的存储方法?hash表采用数组+链表+红黑树的存储结构。用put()存储时,将key值转换成hash值,然后再转换成数组的下标,如果此处没有值,直接插入,若有值,则碰撞。碰撞之后,存储到链表中,链表长度大于8时,将其转换成红黑树。hashcode()会将key值转换成hash值,hash值对数组长原创 2021-10-11 18:52:58 · 193 阅读 · 0 评论