- 博客(5)
- 收藏
- 关注
原创 HashMap死循环问题
HashMap死循环主要是指JDK7中,HashMap扩容时采用头插法。如果在多线程情况下,2条线程同时进行扩容操作,会造成两个结点的next指针互相指向对方的情况。在JDK8中,扩容已经由头插法改为尾插法,多线程情况下虽然不会造成死循环,但是会造成操作的重复执行。比如最简单的一个情况,一个链表只有A、B两个结点,线程1和线程2一开始都指向A结点。但是线程2并不知道,所以线程2又要从A开始进行一番操作,把。线程1扩容时,会在新数组中颠倒链表的原顺序,变为。此时线程1已经完成了扩容,B是头结点,
2022-11-22 14:59:44
491
原创 HashMap底层结构、扩容机制
当链表的长度大于等于8时,为了将查找时间复杂度由n降为logn,这个链表就会转化为红黑树。直接说结论:会,但不是立刻转回,而是要等到下一次resize()时检验结点数与。在JDK8之后,HashMap由之前的“数组+链表”转为“但上面都是很基础的内容,下面讲两个比较不常见的知识点。说明确实定义了一个“树化的临界值“,且这个值为8。这个函数中,并不是直接把链表转化为红黑树,而是。太小会导致数组的利用率低,存放的数据会很分散。数组即左边一列,链表即横着相连的那部分。的关系,如果小于等于6,就可以转回。
2022-11-22 14:56:27
347
原创 HashMap底层put与get过程
首先会先检验这个key是否为null,如果为null,那么hash固定为0,所以每个HashMap中只能存在一个key为null的结点。接着通过对key调用hashCode()函数,计算出它的哈希值,并将这个哈希值的高16位与低16位做异或运算,得到最终的哈希值hash。,因为由这个确定下标的过程可以看出,只有当容量是2的n次幂时,(n - 1)的二进制的低位才会均为1,这样做与运算时保证了低位都有效,不会出现某个位置不会被使用的情况,1、通过hash()函数计算key的哈希值,并得到其下标。
2022-11-22 14:52:59
359
原创 Java中String字面量创建与new创建的区别
由《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》一书中的介绍,在JDK1.7之后字符串常量池分布在堆中。最简单的方式就是通过编写一段代码实际运行检验一下。注意这里比较的是字符串的地址,所有直接用。作比较,正常情况下字符串比较需要用。最终输出的结果即结论。
2022-11-21 15:22:43
336
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人