自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 多线程HashMap头插法扩容导致死循环解析

宏观来说是应该头插法,从头出发,但是多线程会出现后面的节点先出发的情况导致next乱掉了,在新表中,关键操作e = next 和e.next = Table[i]。此时需要获取新的next,即新hashmap中的3是e.next,而3就是next。1.多线程情况下会进行多次扩容,第一次扩容后e与其next位置已经互换,第二次扩容的时候将e放在新的hashmap中后,取next。对于场景如下,两个线程同时需要扩容,线程2阻塞,线程1先进行。这是又移动一次之后,因为需要e= next,所以e此时为3.

2024-03-15 19:28:37 167 1

原创 剑指offer-48. 复杂链表的复刻 49.二叉搜索树与双向链表

请实现一个函数可以复制一个复杂链表。在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。注意:函数结束后原链表要与输入时保持一致。数据范围链表长度[0,500][0,500]。题解:1.复制二字先正确理解,第一下有些没反应过来,需要开辟一个新的空间。2.因为random指针存在,所以需要通过节点来确定在链表中的位置。链表中的位置可以将节点存储在数组中展现,而节点知位置可以用过hashmap实现。代码实现

2024-03-14 20:01:44 111 1

原创 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was B

错误原因在tags不是json格式的,[]写成{}

2024-01-13 16:11:49 446 1

原创 原本没问题,但后来出现Could not resolve placeholder ‘xxx‘ in value “${xxx}”

maven clear 之后 maven install。之前几天运行没有问题,但今天运行时候出现错误。原理不清,但可以用来尝试。配置文件yml的读不上。

2024-01-11 16:44:16 560 1

原创 leetcode笔记 TopCode

需要注意的是hashmap的基本语法,以及最后fast-slow时不需要额外处理,此时的fast和slow都是代表没做处理的情况。答案厉害的是hashmap存的是下标,不是num,所以遇到重复时候直接left+1就行。思路是双指针滑动窗口,自己写的确实不够简便。

2023-12-17 11:05:14 1295 1

原创 JAVA容器

为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲至了过了,Hash 值的范围值-2147483648 到 2147483647,前后加起来大概40 亿的映射空间只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个 40 亿长度的组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是”(n - 1) & hash”。(n 代表数组长度)。

2023-12-03 13:06:34 33 1

原创 leetcode笔记--代码随想录--额外题目

先排序,遍历,当前这个跟上一个不一样的时候,用count做下标来判断是否被用过(之前先建立数组,长度arr+1,初始化)自己写的有些麻烦,比较的东西太多了,还不如答案那样直接暴力赋值,不用管那么多,从性能上一次复制和一次比较也差不了多少。答案直接用boolean数组, 我的数组是用出现次数作为下标,这个是用数值内容作为数组下标。答案的方法是使用下标代替数值,建立数组会出现大量没用到的情况。答案用的双指针,从两端分别出发,看最后是否能碰上。都是双指针,也没想太多,可能这样的题看的比较多了。

2023-12-02 11:03:10 35 1

原创 JAVA基础笔记

浅拷贝: 浅拷贝会在堆上创建一个新的对象 (区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象深拷贝 : 深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。浅拷贝:clone()直接调用父类Object的clone()方法。看出两个对象还是同一个Address对象。Person person1 = new Person(new Address("汉"));// 浅拷贝 true深拷贝。

2023-12-01 18:56:47 48 1

原创 leetcode笔记-代码随想录-并查集

按照模板。init() 遍历赋值。join():u和v分别find,判断源头是否一致find():find结果若是自己,直接输出,不是则递归。(源头的find是自己)same():find判断,可以省。

2023-12-01 18:54:32 64 1

原创 leetcode笔记--代码随想录--单调栈

至于为什么这么算,主要在于求面积的高就是当前在栈顶处且当前遍历的元素小于他,并且宽是从栈顶到当前遍历的元素。自己想的有些复杂,想着存储递增的可以在栈中得到索引,但存储递减的话也是能得到的,当前存储的时候的i就是在栈中比它小的那些索引对应的数值。列不行的原因是无法通过当前状态就确定这个列的数值应该是多少,也无法通过叠加的方式得到。单调栈的思想是存储单调增加/减小的下标,这里存储下标是因为题目一般会用到索引信息。另外因为栈是升序,所以会栈顶第二个位置的元素跟栈顶元素之间的元素是大于他们的。

2023-11-24 16:18:55 22 1

原创 leecode刷题笔记--代码随想录--动态规划--子序列

这部分题建立dp数组时,dp[i]表明的是使用第i个数值时候的情况。

2023-11-19 13:50:42 76

原创 HashMap多线程死循环解析,数组扩容为2的幂次方与hashcode计算需右移16位做异或运算原因

总结一句即,因为扩容使用头插法导致扩容之后链表顺序改变了,当双线程时出现一个线程阻塞,另一个线程完成扩容之后,对于阻塞线程来说,next位置与实际位置不匹配,且成为环状,这样再扩容时候会出现环形链表。当数组长度不是2的幂次方时,其二进制数至少会有一位为0,跟hash与运算得到的二进制数那一位也必定是0,也就是说那一位为1所对应的下标时永远取不到的,这造成资源浪费。此时出现问题,对于线程2来说,e2引用的3的next是2,但实际上3的next是null。扩容之后,因使用头插法,所以链表的顺序改变了。

2023-10-12 08:10:47 95

原创 Webserver报错处理

原因是没有启动Redis。

2023-10-06 09:51:44 88 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除