自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(189)
  • 资源 (2)
  • 收藏
  • 关注

原创 Java 中的 sleep、wait、join 怎么理解

在 Java 中,sleep()、wait() 和 join() 都是与线程同步和控制相关的常用方法,它们各自有不同的功能和使用场景。

2024-09-18 16:02:57 433

原创 java序列化

Java 会根据类的名称、成员变量、方法等信息自动生成一个 serialVersionUID。但是,如果你在不显式定义的情况下对类做了修改,例如添加或删除字段、方法等,编译器可能会生成不同的 serialVersionUID,从而导致反序列化失败。因此,显式声明 serialVersionUID 是一种好的实践。

2024-09-18 15:47:20 992

原创 leetcode 33. 搜索旋转排序数组

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]。输入:nums = [4,5,6,7,0,1,2], target = 0。输入:nums = [4,5,6,7,0,1,2], target = 3。

2024-09-10 15:06:00 272

原创 leetcode 31. 下一个排列

例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。那肯定是和尾部比它大的换,比和它小的换不会让数字变大,所以从尾部开始找第一个比它大的(位置j),两者交换。类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]。例如,arr = [1,2,3] 的下一个排列是 [1,3,2]。

2024-09-05 15:51:50 400

原创 回调是什么以及同步异步回调怎么实现

在 Java 中,回调(Callback)和异步回调(Asynchronous Callback)都可以通过接口、匿名类或 lambda 表达式来实现。下面我将分别展示如何在 Java 中实现回调和异步回调。

2024-09-04 22:57:56 266

原创 threadlocal的一些用法,以及如何解决可重入分布式redis锁

好的,经过我的思考,threadlocal是一个还不错的选择,因为是对线程内共享的,事实上threadlocal应该是为了解决一些在线程内传递状态所使用的手段,(要不然你还得疯狂传参,中间要是遇到封装的第三方库,你还改不了),好,这个状态其实说起来应该是叫上下文context比较合适,除了状态外,它也可以是用户身份,任务信息等。这里的话对于可重入分布式锁,就可以有一个Integer类型的threadlocal变量,重入就+1,释放就-1,直到0了,才真正释放锁就可以了。

2024-08-26 17:07:51 546

原创 leetcode 875. 爱吃香蕉的珂珂

珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。说实话,这题我不会,但看了题解后,看懂了一些,尝试写一下题解,这是道经典二分的题,要找的结果是最终的k,那么区间左端点代表速度最小值,右端点代表速度最大值,要找中间合适的 k。通常来讲的二分就是 找到 k==k,这里的判定条件是速度 k 能刚好吃完所有堆的香蕉,不过这种类型的二分需要找好分割边界条件的点和初始的左右端点。输入:piles = [30,11,23,4,20], h = 5。输入:piles = [30,11,23,4,20], h = 6。

2024-08-25 22:59:44 278

原创 使用一致性哈希解决哈希分片负载均衡的扩展性问题

解决方案也有,那就是一致性哈希,一致哈希算法是对 2^32 进行取模运算,是一个固定的值。可以想象有一个圈,存储节点做哈希,比如根据节点的 IP 地址进行哈希。通常来讲可以范围分片或者哈希分片,将数据拆分到不同的存储节点上去。假定选择ID,那有可能热点数据集中到同一张表里了,没起到分摊访问数据库流量的作用。有亿级数据,如何拆分,使得访问请求不会造成数据库崩掉?还可以为硬件配置更好的节点增加权重,比如对权重更高的节点增加更多的虚拟机节点。这都可以,甚至不同机器的配置不同,可以根据配置分配权重,然后分发流量。

2024-08-20 17:17:59 592

原创 倒排索引是什么?有什么用?

mysql的全文索引的实现方式其实就是倒排索引,倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射,常被应用于搜索引擎和关键字查询的问题中。这种倒排索引对于检索系统的关键词检索或者大数据处理的word count功能等,都是非常关键的功能。我们知道索引通常是用来查询某个key是否存在,或者避免一些外部排序操作的。但倒排索引是个啥呢?

2024-08-18 17:51:44 236

原创 leetcode 397. 整数替换

leetcode 397. 整数替换。

2024-08-12 23:35:18 361

原创 leetcode 124. 二叉树中的最大路径和

然后决定当前这个节点为根节点的树能达成的最大路径和是多少,然后再把这个节点作为最长路径的一部分的结果返上去,有点dp 那味。二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6。输入:root = [-10,9,20,null,null,15,7]输入:root = [1,2,3]路径和 是路径中各节点值的总和。

2024-08-12 23:10:27 230

原创 海量数据排序,外部排序的方式

所以这时候就需要采取外部排序,把数据分成若干块,分别排好序,从每个块里挑选最小的,进入堆。此时堆中最小的就是全局最小的,堆顶元素i出堆后,从堆顶元素i所在块里再拿出最小的,重复此过程,直到结束。来解决海量数据排序问题,但这个问题的前提是这些待排序数字不能太稀疏,因为其思想就在于将每个四字节数字转化为一个bit,假设稀疏,那连着很多bit都没有数字就白搞了。除了上述情况外,就算不稀疏,也有可能通过这种奇技淫巧也无法压缩下去。

2024-08-08 12:28:20 166

原创 海量数据去重、排序,bitmap的巧用

那我们来想一想除了hashmap还有什么可以O(1)来判断元素的状态。去重可以用bitmap,排序也是,当都存进bitmap后,可以从头遍历,因为已经是有序了。假设内存足够,那就放进hashmap就好了,O(1),很快就能查得到。假设给你40亿个qq号,问你某个qq号是否存在怎么办。

2024-08-08 11:48:09 123

原创 leetcode 718. 最长重复子数组,leetcode 1143. 最长公共子序列

和两道十分相似的题,就不放题目了。

2024-08-05 21:32:41 318

原创 leetcode 139. 单词拆分

一定要有自己的思想,就算没有也多看看几个题解慢慢形成,拒绝思维定势的。

2024-08-02 11:19:14 345

原创 leetcode 450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。输入: root = [5,3,6,2,4,null,7], key = 0。输入:root = [5,3,6,2,4,null,7], key = 3。另一个正确答案是 [5,2,6,null,4,null,7]。输出:[5,4,6,2,null,null,7]输出: [5,3,6,2,4,null,7]

2024-07-27 10:01:47 247

原创 leetcode 106. 从中序与后序遍历序列构造二叉树

具体切分区间的方式利用了两个map,通过后序遍历的最后一个作为根节点找中序遍历切分点idx,然后根据中序遍历切分的两块区间去找后序遍历下一节点的两个区间。给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]输入:inorder = [-1], postorder = [-1]

2024-07-24 23:17:08 468 1

原创 fastjson和jackson的对比,同样的序列化/反序列化,有什么区别

挖个坑,之后填。

2024-07-24 16:55:30 138

原创 Java的序列化和反序列化

C++语言具有内存操作符,所以二进制串的概念容易理解,例如,C++语言的字符串可以直接被传输层使用,因为其本质上就是以’\0’结尾的存储在内存中的二进制串。对于跨语言间的通讯,序列化后的数据当然不能是某种语言的特殊数据类型。因为互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分。一般而言,TCP/IP协议的应用层对应与OSI七层协议模型的应用层,展示层和会话层,所以序列化协议属于TCP/IP协议应用层的一部分。至于为什么要序列化和反序列化呢?

2024-07-24 15:59:55 484

原创 leetcode 116. 填充每个节点的下一个右侧节点指针

这道题假设用层序遍历开一个队列来做其实非常的简单,但是他既然说了进阶要不开额外空间,这一点就值得考量了。实际上就是怎样才能去掉这个队列呢,那就必然得拿到下一个节点,这个可以借助父节点的next来做,因为遍历到下一层的时候,父节点的next是已知的。所以就一目了然了,这道题除了迭代外,还可以用递归。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。

2024-07-23 23:23:58 411 1

原创 @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400

而SubmitParam中的某一个参数,我给加上了@Data和@Builder,注释,这个@Builder注释可好,直接给我干400了,其实去掉@Builder或者加上@AllArgsConstructor和@NoArgsConstructor都可以解决这个问题。(4)如果你想让子类继承父类的属性,那么你需要在子类的全参构造函数上使用 @Builder 注解,并且在父类上使用 @AllArgsConstructor 注解,否则子类的构造器类不会包含父类的属性。所以我就排查了半天,结果没发现啥错误,有点懵。

2024-07-23 20:14:03 678

原创 Java8新特性stream的原理和使用

看起来好像是一个个方法顺序对所有的操作(map、filter、distinct。)执行,实际上不是,因为效率上是无法接受的,其基本思想是在一次迭代中尽可能多的执行用户指定的操作。

2024-06-28 10:54:59 347

原创 Java的lambda表达式使用方式,lambda表达式到底为了做什么

感觉从狭义的使用目的来说,lambda表达式就是为了简化某些匿名内部类,当然不是所有的匿名内部类都能被简写。也就是你想要某些返回值作为参数不用去显示的写调用方法或者传参,具体来看看下面的。具体的语法实际上就是->前面是传参,假设无参就是(),只有一个参数可以省略括号,多个参数就(a, b, c)。->后面是执行代码。进一步的写法还可以用::代替一些->,这是Java 8中的Lambda表达式写法之一,

2024-06-27 14:14:39 173

原创 logi k580键盘键位匹配错误,win与mac的切换问题

由于我一直是把k580当作mac的外接键盘,直到有一天借给了win的同学拿回来我发现我的cmd键位失灵了,opt键位变成了cmd,有点难崩,搜了半天发现原来k580可以切换。长按Fn+P超过3秒切换成windows模式,Fn+O键超过3秒切换成mac模式。

2024-05-18 15:32:53 1141

原创 springboot常用注释

标明启动类的注释,也就是标明项目程序入口,实际上集成了非常多的注释。

2024-04-25 21:28:52 908

原创 linux的权限操作

常见的 chmod 777 filename就是上面那个意思啦,111111111每三位是一个7,代表user group other的读、写、执行权限。在此基础上,数字发就容易理解了。

2024-04-04 20:01:23 364

原创 huffman编码树

首先对字符统计出现次数,代表权重值,假设FDTERA => 1 1 3 4 5 8,然后按照权重从小到大挨个合并(然后哈夫曼树建立完成,左子树是0,右子树是1,这样就完成了哈夫曼编码,最近好像笔试经常见到Huffman树,就记录一下吧。

2024-04-04 19:43:29 178 1

原创 tcp三次握手和四次挥手

假设只有两次握手,那么服务端收到第一个SYN就得建立连接了,直接ESTABLISHED,回SYN ACK,虽然后续客户端会发现回的SYN ACK不是他想要的,会发送RST报文终止tcp,但是这平白无故浪费了服务端资源去建立了一个无用tcp,甚至可能都开始发数据了。

2024-04-01 21:40:43 555

原创 leetcod 685. 冗余连接 II

输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 到 n)的树及一条附加的有向边构成。每个元素是一对 [ui, vi],用以表示 有向 图中连接顶点 ui 和顶点 vi 的边,其中 ui 是 vi 的一个父节点。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。输入:edges = [[1,2],[2,3],[3,4],[4,1],[1,5]]输入:edges = [[1,2],[1,3],[2,3]]

2024-03-17 10:46:56 542

原创 简单描述一下消息队列

Message Queue,就是个队列。

2024-03-14 15:52:35 214

原创 有了HTTP协议,为什么还要有WebSocket

现在的应用场景可能更多的是,前端发起一次HTTP请求,服务器后端返回一次HTTP响应。但是有这样的场景,是需要服务器主动给前端发送请求的。最常见的场景是扫码登陆。这里有两种解决方案,一种是微信的解决方案,前端代码每隔一两秒就发送一个HTTP请求给服务器,这样服务器就能返回响应消息了。想一想是不是登陆微信扫码有时候会感觉卡了一两秒才登录,这是因为电脑登陆二维码出现后,手机扫了它,然后电脑隔一两秒发送一个询问给服务器,问这个二维码被扫了没有。但是这个缺点非常明显,会不停的发送请求,这占用了带宽;

2024-03-13 21:00:07 277

原创 运输层端口号、复用和分用的概念

运输层不论是TCP还是UDP都得在网络层封装成IP数据报发送,只不过会有协议字段标识发送方使用的TCP还是UDP,然后接收方根据这个标识来决定如何解析IP数据报。所以为了能让不同计算机上的进程进行网络通信,就需要统一的方式来进行标识,这就是TCP/IP体系的端口号,范围是0~65535,2字节。运行在计算机上的进程用进程标识符PID来标志,但不同操作系统使用的进程标识符又不一样。常见的一些协议所使用的运输层协议和端口号。

2024-03-06 10:42:10 160 1

原创 HTTP/2、HTTP/3分别解决了什么问题

总的来说就是HTTP/1.1是导致队头阻塞问题,HTTP2是TCP层面导致队头阻塞问题。

2024-03-04 20:02:28 941

原创 HTTP有什么缺陷,HTTPS是怎么解决的

HTTP是明文的,谁都能看得懂,HTTPS是加了TLS/SSL加密的,这样就不容易被拦截和攻击了。SSL是TLS的前身,他俩都是加密安全协议。前者大部分浏览器都不支持了,后者现在用的多。

2024-03-04 15:55:46 1277

原创 URI到底是个啥

URI是统一资源标识符(Uniform Resource Identifier),URL是统一资源定位符(Uniform Resource Locator)。具体如何标记和区分服务器上的资源用的其实就是URI,因为其经常出现在浏览器的地址栏里,所以也俗称“网址”。但实际上URI和URL并不是一个东西,只不过HTTP的世界里通常网址都是URL,所以二者有时候被混淆了。

2024-03-02 10:15:22 436

原创 常见http响应状态码

200 OK,是最常见的成功状态码,表示一切正常204 No Content,也是成功状态码,与200一样,只不过没有body206 Partial Content,也是成功状态码,代表body里资源不是全部,是http分块下载或断点续传的基础。

2024-03-01 22:28:59 325

原创 http状态,cookie、session、token的对比

但是随着互联网发展,访问量激增,每个用户都存储一个session id在服务器内存里,服务器吃不消。现在是token存在了浏览器客户端,服务器端只是来验证这个token,相当于是cpu换内存用。所以,当用户第一次登陆后,服务器会创建一个带有签名的无规律字符串session(会话)返回给用户浏览器,这样就算黑客拿到session id也没啥大用,这是带签名的。cookie是放在浏览器里的数据,这样就不用每次我们手动输入账户名和密码,但这并不安全,假设电脑被黑了,浏览器里的个人信息就泄露了。

2024-03-01 20:54:39 448

原创 HTTP报文长什么样

前两者合称或者,消息正文也叫。其中header是必须的,body则不是,另外header和body中间必须要有一个空行。

2024-02-27 16:07:06 299

原创 leetcode 309. 买卖股票的最佳时机含冷冻期

一开始陷入思维定势了,我就枚举出所有可能情况,也就是说具体买卖了多少次,于是有了第一版代码,结果耗时62ms。后来看了人家的发现,其实不需要知道具体买卖多少次,只要知道当前持有与否就够了。所以有了第二版代码0代表持有,1代表没有。给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格。解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。输入: prices = [1,2,3,0,2]

2024-02-27 10:34:51 198

原创 redis的限流器都有哪些方式

redis限流是必须的,因为你服务器每秒能处理的请求数量是有限的,超过限制轻则服务变慢,重则直接服务崩溃。解决方式主要有三种,计数、漏桶(不讲)、令牌桶。

2024-02-26 14:41:53 543

网上交易系统,使用java原生jdbc和swing

使用java原生jdbc和swing来编写的一个很简单的网上交易系统,使用PostgreSQL作为数据库存储数据。

2020-07-03

myGoBang(java文件).zip

通过Java实现的五子棋项目,核心在于评估局面中每点分数,生成博弈树进行极大极小搜索,运用alpha-beta剪枝进行加速,同时带有防守和禁手。

2020-06-26

空空如也

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

TA关注的人

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