自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 maven install 报错 “Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field ‘com.su”

这个报错是我在运行一个java项目时,进行maven install 时发生的报错,这个报错一般属于pom.xml中的。没有设置版本或者版本太旧导致的,在修改之前我都lombok是1.18.26,之后改为1.18.36成功运行没有报错。

2025-03-30 00:31:07 157

原创 JAVA并发-Callable

可以使用ExecutorService、Callable、Future实现有返回结果的线程,ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。Callable 接口类似于 Runnable,但是 Runnable 不会返回结果,并且无法抛出经过检查的异常,而 Callable 依赖 FutureTask 类获取返回结果。

2025-03-29 21:53:51 155

原创 Java并发-Runnable

Runnable接口是Java提供的一种用于实现多线程的接口,通常用来定义任务的具体逻辑。与Thread类不同,Runnable接口只提供一种抽象方法run(),没有任何与线程的生命周期、管理相关的功能。它的主要作用是与Thread类或线程池(如ExecutorService)配合,作为线程的任务载体,使任务与线程的执行分离,从而提高代码的灵活性和可维护性。Runnable接口直接继承自Object,没有复杂的继承关系。通过实现Runnable接口,可以将任务逻辑放入run()方法中,随后通过。

2025-03-29 21:53:20 298

原创 JAVA并发-Thread

正式因为没有内核的支持,所以通常来讲只会支持进程级别的资源分配,并且所有线程的生命周期需要用户程序自行处理,因此用户线程实现的程序也提高了复杂度和故障机率,Java中的线程曾经使用用户线程实现,最终由于其复杂度被放弃。所以当前应用程序内共有两个线程:主线程【普通线程】、Hook线程【普通线程】、子线程【守护线程】,所以当主线程结束后,应用程序内没有普通线程了,所以被设置为守护线程的子线程就停止执行了。在这段代码中,Hook线程的任务只是打印日志,当run()方法执行完毕(日志打印完成后),线程自然终止。

2025-03-29 21:52:40 1041

原创 JAVA并发-什么是指令重排?

指令重排是计算机编译器或处理器为了提高性能而对指令执行顺序进行的一种优化手段。在多核和多线程的计算机系统中,指令重排的目标是通过优化执行顺序来提高指令级别的并行度,充分发挥计算资源,加速程序的执行。

2025-03-29 21:49:07 236

原创 JAVA并发-ReentrantLock 与 synchronized的区别

可以实现多路选择通知(可以绑定多个 Condition),而 synchronized 只能通过 wait 和 notify/notifyAll 方法唤醒一个线程或者唤醒全部线程(单路通知);通常需要在 finally 块中调用 unlock 方法以确保锁被正确释放。在某些情况下,性能可能稍差一些,但随着 JDK 版本的升级,性能差距已经不大了。会自动释放锁,当同步块执行完毕时,由 JVM 自动释放,不需要手动操作。通常提供更好的性能,特别是在高竞争环境下。

2025-03-29 21:48:12 155

原创 完美解决“本地计算机上的 mysql 服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止””

依然没有什么用,这个时候其中一个博客给了我灵感,他说是因为他改了my.ini,所以才导致同样的问题(很显然我没改这玩意,但是我想了想,没准真是这个问题,所以我就找到了我的my.ini,可以使用everything搜索一下在哪里【今天莫名其妙发现Navicate连接不上本地MySQL了,这个一直健壮的老家伙竟然莫名其妙没了,然后开始排查问题,首先就是查看服务是否正常运行,果然并没有。然后我就在网上找了一个基础的my.ini配置【如果你有很重要的配置记得备份】,然后替换了我的my.ini【

2025-03-29 10:58:53 397

原创 场景-如何使用 JustAuth 集成第三方登录?

JustAuth插件网址:https://justauth.wiki组件的帮助文档:https://justauth.wiki组件的GitHub:GitHub - justauth/JustAuth: 🏆Gitee 最有价值开源项目 🚀:100: 小而全而美的第三方登录开源组件。目前已支持Github、Gitee、微博、钉钉、百度、Coding、腾讯云开发者平台、OSChina、支付宝、QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、StackO

2025-03-28 19:07:49 258

原创 Redis-解决缓存和数据库一致性问题

首先引入缓存就是为了提高客户端对数据的查询效率。最简单的方式就是全量数据刷到缓存中,一般是通过先将数据库的数据全量刷入缓存,不设置缓存失效时间。写请求只更新数据库,不更新缓存,启动一个定时任务定时将数据库的数据更新到缓存中。这样做有几个缺点:缓存利用率低:不经常访问的数据也存在缓存中,且不失效;数据不一致:因为是定时刷新,所以不一致的概率取决于定时时间。

2025-03-28 17:16:00 1464

原创 Java-Java修饰符

抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

2025-03-27 17:13:12 917

原创 Java-浅拷贝与深拷贝

浅拷贝只拷贝目标对象,至于目标对象内部的引用类型指向的还是原对象;其中otherTeacher就是teacher的浅拷贝。深拷贝就是连带目标对象中的对象一起拷贝。

2025-03-27 17:11:21 178

原创 JVM-虚拟机类加载机制

以一组符号来描述所引用的目标;符号引用可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可,符号引用和虚拟机无关;在编译的时候每个java类都会被编译成一个class文件,但。

2025-03-27 17:10:46 788

原创 Redis-如何基于Redis实现分布式锁?

基于redis实现分布式锁,可以通过SET NX命令,也就是当客户端需要申请锁的时候可以往redis尝试加入一个拥有唯一ID的锁变量,并通过EXPIRE设置过期时间,另外创建一个守护线程,定时检测锁的失效时间,如果锁快过期了,操作共享资源还没有完成,那么就自动对锁进行续期,重新设置过期时间;在完成对共享资源的操作后,通过编写Lua脚本判断是否为所属锁,并将其从redis删除以释放锁,释放操作具备原子性。【包括为什么要设置唯一ID等】

2025-03-26 11:23:12 103

原创 Redis-如果Redis分布式锁引用在redis集群应该怎么办?当出现主从切换时导致丢锁应该如何处理?

来解决,他的基本思路就是通过改用多个独立的redis服务器或者redis Cluster集群,在客户端获取锁时先计算当前时间,然后设置过期时间,并取其中比如几十毫秒用作获取锁的过期时间,在获取锁时会依次向独立服务器获取,如果过半数获取成功,并且获取时间小于设定的过期时间,那么获取成功,否则获取失败,无论成功与否最后会向所有redis服务器或者集群解除锁。另外redis普通分布式锁需要自己加唯一标识,在Redlock中则是通过。

2025-03-26 11:22:42 120

原创 场景-认证登录这块为什么用 JWT?

使用 Session 进行身份认证的话,实现单点登录,需要我们把用户的 Session 信息保存在一台电脑上,并且还会遇到常见的 Cookie 跨域的问题。但是,使用 JWT 进行认证的话, JWT自己包含了完整的认证授权信息,可以轻松实现跨域支持,并且这一点也使得再微服务架构中不需要可以维护会话状态的一致性,使得JWT也更加适应微服务架构。因此,即使你点击了非法链接发送了请求到服务端,这个非法请求也是不会携带 JWT 的,所以这个请求将是非法的。JWT还支持扩展和定制,可以灵活的完成其他业务功能。

2025-03-26 11:22:10 127

原创 场景-数据库直接保存的密码还是?

每次用给定的信息摘要查找字典,即可快速找到碰撞的结果。对于单机来说,暴力枚举法的时间成本很高(以14位字母和数字的组合密码为例,共有1.24×1025种可能,即使电脑每秒钟能进行10亿次运算,也需要4亿年才能破解),字典法的空间成本很高(仍以14位字母和数字的组合密码为例,生成的密码32位哈希串的对照表将占用5.7×1014 TB的存储空间)。因为不可逆MD5算法的hash算法是固定的,所以同一个字符串计算出来的hash串是固定的,可以采用暴力枚举法、字典法、彩虹表(rainbow)法等多种方式破解哈希。

2025-03-26 11:20:49 212

原创 场景-JWT无状态有什么问题考虑过吗?强制让用户下线怎么弄?

3.可以使用缓存创建一个Token黑名单,把客观上需要注销的token存入即可;2.注销时从客户端删除存储的token;1.合理的设置令牌过期时间;

2025-03-26 11:20:15 67

原创 LeetCode-阶乘后的零

【代码】LeetCode-阶乘后的零。

2025-03-26 11:18:31 255

原创 LeetCode-插入区间

首先一个比较暴力的方式,就是直接将这个区间加入到末尾,然后根据区间左边界排序后,合并区间即可。第二个解题思路大致是:定义一个minIndex一个maxIndex分别表示待插入区间左边界和右边界位置。

2025-03-26 11:17:55 201

原创 LeetCode-最长回文子串

解决这道题的思路要从回文串的定义开始,一个回文串是一个中间对称的字符串,并且看题,题目有提到最长,并且存在着在多个解中寻找最长,那么很大概率是动态规划的题型。如果相等判断串长度是否小于等于3,也就是j - i < 3 【比如4-2 < 3】,如果成立直接为true;第二层循环遍历子串起始位置,并动态计算出子串结束位置j = i + L - 1,如果越界记得break;接着以长度为外层循环,依次判定从长度2开始的子串,并依次递增长度;否则就比较i+1,j-1是否为回文串,即可。最左右两边的两个字符相同;

2025-03-26 11:16:43 374

原创 LeetCode-旋转链表

其实旋转链表可以等价于寻找倒数第n个元素,因为旋转其实就是将每一个节点向右移动k%length位置,草稿纸上画一下其实也就是将从倒数第n个元素截断,然后以该元素作为新的头节点,将尾节点接在旧头节点上,另外记得将旧尾节点置为空。

2025-03-26 11:16:11 126

原创 LeetCode-逆波兰表达式求值

这道题其实就有点做计算题的感觉,其实就是一个栈存放操作数,然后遇到数字就入操作数栈,遇到字符就将栈中头两个元素取出进行运算,然后将运算结果入栈,重复直到操作数栈为空。

2025-03-26 11:15:41 281

原创 LeetCode-从中序与后序遍历序列构造二叉树

这道题与已知前序和中序求其实是一样的,前序的话就是根节点在前,后序就是根节点在后,只需要每次递归从后序中获得根节点,然后再到中序中找到根节点的位置,递归构造左右节点即可。

2025-03-26 11:15:10 171

原创 LeetCode-填充每个节点的下一个右侧节点指针 II

层序遍历秒了,首先我们通过层序遍历可以获得每一层的队列,通过先进先出,将每一个出队列的元素指向此时队列首部的元素,如果队列为空就指向null即可。

2025-03-26 11:14:39 131

原创 LeetCode-二叉树展开为链表

说白了其实就是将二叉树序列化,并且采用先序序列,也就是只需要通过先序遍历递归方式,将遍历到的节点存入list即可,然后将得到的list遍历,使得每个元素的right指向下一个元素即可。

2025-03-26 11:14:07 247

原创 LeetCode-二叉树的右视图

层序遍历秒了,每一层队列最后一个元素存入结果即可。

2025-03-26 11:13:34 276

原创 LeetCode-求根节点到叶节点数字之和

这道题其实就是深度优先搜索,因为他需要一次性直接从根节点访问到叶子节点,所以采用深度优先搜索,并且每次搜索时,将原先的值乘以10再加上现有的值即可构成所需数字,然后依次累加遍历到叶子节点的值即可。

2025-03-26 11:12:56 123

原创 笔试真题-2023年用友集团秋招Java岗笔试-A

git branch -a 查看所有分支信息git branch -r 查看所有远程分支git branch 只显示本地分支git branch -d 用于删除分支信号量 = 可用资源数 - 等待资源进程数正确答案为B;装饰模式是一种结构型设计模式,它的主要特点是:脏读:在同步启动的A、B两个事务中,A事务执行读操作,读到原始数据,B事务执行写操作修改原始数据,A事务再次执行读操作,能够读到B事务未提交的事务修改,所以为脏读。【读未提交,最低级别,任何情况都无法保证,所以会出现脏读、不可重复读、幻读】不可重

2025-03-23 21:20:05 785

原创 JVM-GC

GC就是垃圾回收机制,其实像程序计数器、虚拟栈、本地方法栈等随线程而生,随线程而死,栈中的栈帧随着方法的进入和退出有条不紊的执行出栈和入栈的操作,每一个栈帧要分配多少内存也是在编译器就确定好了,尽管在运行期会有即时编译器进行一些优化,但基于概念模型我们还是可以认为他们在编译器就确定好了,但是Java堆和方法区不一样,一个接口的多个实现类的内存需求可能不一样,不同的条件分支所需的内存也可能不一样,所以只有在运行时我们才知道需要创建多少个对象。

2025-03-23 16:29:13 754

原创 LeetCode-组合

【代码】LeetCode-组合。

2025-03-23 13:32:21 194

原创 LeetCode-电话号码的字母组合

很经典的排列组合,就采用回溯法即可,在回溯法中主函数中通常会申请一个List<>变量用于存放回溯法的结果,在回溯法的递归方法中,一般会传入刚刚申请的结果变量,需要遍历的目标变量,用于存放映射关系的变量,当前位置索引,存放一次结果的变量。有时在回溯过程中有一些情况需要剔除则会需要剪枝。一般形式是刚进入递归方法之后会首先判断是否到达了需要存储的条件,如果没到达则会开始剪枝,然后排除剪枝之后开始回溯。

2025-03-23 13:31:44 238

原创 LeetCode-只出现一次的数II

通过逐位统计数组中每个二进制位上 1 的出现次数,利用模 3 判断目标数字的二进制位,最终通过位操作构建出只出现一次的数字。通过HashMap存储每个数字出现的次数,然后找到只出现一次的。

2025-03-23 13:30:36 180

原创 LeetCode-只出现一次的数字

由于两个相同的数字进行异或运算得0,0和任何数字进行异或运算得该数字,所以这里符合场景,全部两两异或即可。

2025-03-23 13:30:00 233

原创 LeetCode-从前序与中序遍历序列构造二叉树

2.在中序遍历中找到根节点对应的下标;3.根据这个下标划定左右子树的范围;1.先从前序遍历中拿出根节点;4.递归左右子树回到第一步;

2025-03-23 13:29:29 185

原创 LeetCode-两数相加

这就是单纯的两个链表进行两数相加,现在是逆序的正好方便我们进行运算,通过同时遍历两个链表,并且设置一个carry值代表是否进位,并在计算sum时加上他,将每次计算好的sum如果大于10则carry为1,并且sum对10取余,然后存入一个新的结果链表中,否则直接存入。另外离开循环后还需要判断当前carry值是否为1,如果有则再加一个节点存入1,否则直接返回即可。

2025-03-23 13:28:47 167

原创 LeetCode-括号生成

这道题看题干要求出最多可能的情况,并需要列举,那么就是使用回溯法了,这里还需要解决匹配的问题,通过观察不难看出,要得到匹配的括号,在构建这个字符串的时候 ,每次加入一个括号有两种选择,分别是左括号和右括号,但是有一点就是当你加入的是右括号的时候,左括号要是比右括号还少那么一定不行,所以第一个条件的诞生了【左括号的数目要多余右括号才能加入右括号】,那么第二个条件就是在插入左括号的时候,由于受到括号个数限制,所以第二个条件诞生了【左括号的个数总和不能大于n】。根据这两个条件就可以开始回溯法了。

2025-03-23 13:27:04 287

原创 LeetCode-最大子数组和原题

最终,maxAns = 6,即最大子数组和为 6,对应的子数组是 [4,-1,2,1]。1 比 -2 + 1 = -1 更大,从 1 开始新子数组。1 + (-3) = -2 比 -3 更大,继续扩展子数组。4 比 -2 + 4 = 2 更大,从 4 开始新子数组。4 + (-1) = 3 比 -1 更大,继续扩展子数组。6 + (-5) = 1 比 -5 更大,继续扩展子数组。5 + 1 = 6 比 1 更大,继续扩展子数组。1 + 4 = 5 比 4 更大,继续扩展子数组。maxAns 更新后。

2025-03-23 13:26:34 368

原创 LeetCode-最小路径和

4.普通情况则代表可以通过上一个或者左边一个走到,那么就是取两种情况最小值即可,f(i,j) = Math.min(f(i-1,j),f(i,j-1)) + grid[i][j];1.当i = 0时,意味着终点在第一行,那么f(0,j) = f(0,j-1) + grid[0][j];2.当j = 0时,意味着终点在第一列,那么f(i,0) = f(i-1,0) + grid[i][0];【因为只能向下走到】3.当i = 0,j = 0,就代表就是在起点,那么f(0,0) = grid[0][0];

2025-03-23 13:26:02 243

原创 LeetCode-三角形最小路径和

与矩阵的最小路径和相差不大,不过这次不是只能向下和向右,而是对于第一列来说只能来源于上一行列索引相同的元素,对于最后一个只能来源于上一行列索引-1的元素,而中间的则选择其中最小的即可。

2025-03-23 13:25:31 103

原创 LeetCode-Pow(x, n)【快速幂】

快速幂主要是两个思想【位运算&分治】,分治是因为,就比如我要算2^{8},那么我就可以算(2^{4})^{2},那么我在算2^{4}的时候又可以把他替换成(2^{2})^{2},以此类推达到分治的目的。另外如果n为奇数怎么办,那就是把他转化成偶数然后最后的结果多乘一个x即可。【判断n为奇数可以直接用n & 1,也就是看二进制位最后一位是否为1】b每次除以二其实可以通俗的理解为(2^{4})^{2}中的4变成2的过程。如果n为负数怎么办,先把x变成1/x,n变成-n再计算。

2025-03-23 13:25:00 115

空空如也

空空如也

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

TA关注的人

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