自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java注解

注解是一种提供元数据的特殊标记,它可以被添加到Java的。

2024-06-16 22:45:41 321

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

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。当前节点的最大路径: max(自己,自己+左边,自己+右边,自己 + 左边 + 右边)当前节点作为子节点时的贡献:max(自己,自己+左边,自己+右边)给你一个二叉树的根节点 root ,返回其 最大路径和。路径和 是路径中各节点值的总和。当前节点作为子节点时的贡献。

2024-06-16 21:04:41 424

原创 把Vue项目从Window系统迁移到Mac系统的方案

这里是我的项目目录,注意切换到自己的项目目录。

2024-06-15 11:49:45 273

原创 MAC系统下安装VUE

显示如上信息表示安装成功。选择图片中的稳定版本。

2024-06-15 11:06:27 327 1

原创 happens-before 关系

程序顺序规则: 在同一个线程中,代码 x = 1;中的 x = 1 操作 happens-before y = 2 操作。监视器锁规则: 一个线程获取了锁,执行了一些操作,然后释放了锁,另一个线程获取了同一个锁,那么释放锁的操作 happens-before。volatile 变量规则: 一个线程将一个 volatile 变量的值修改为 1,另一个线程读取该变量的值,那么写操作。它定义了哪些操作必须在哪些操作之前执行,从而避免了数据竞争和不一致性问题。happens-before 读操作。

2024-06-14 09:42:03 570

原创 雪花算法和UUID

雪花算法是一个分布式id生成算法,它生成的id一般情况下具有唯一性。由64位01数字组成,第一位是符号位,始终为0。接下来的41位是时间戳字段,根据当前时间生成。然后中间的10位表示机房id+机器id,也可以是单独的机器id。最后12位是序列号。

2024-06-13 20:43:17 698

原创 linux查看端口是否被占用 / 包含某个字符的文件/当前正在运行的进程/根据端口号查找进程

命令用于实时显示当前运行的进程及其资源使用情况。

2024-06-12 12:04:38 247 1

原创 内连接和外连接

内连接:只返回两个表中满足连接条件的行。左外连接:返回左表中的所有行以及右表中满足连接条件的行,右表无匹配行时字段显示为NULL。右外连接:返回右表中的所有行以及左表中满足连接条件的行,左表无匹配行时字段显示为NULL。全外连接:返回两个表中的所有行,无论是否满足连接条件,未匹配行字段显示为NULL。

2024-06-11 21:36:56 221

原创 GET和POST的区别

GET 和 POST 最本质的区别是“约定和规范”上的区别,在规范中,定义 GET 请求是用来获取资源的,也就是进行查询操作的,而 POST 请求是用来传输实体对象的,因此会使用 POST 来进行添加、修改和删除等操作。按照约定来说,GET 和 POST 的参数传递也是不同的,GET 请求是将参数拼加到 URL 上进行参数传递的,而 POST 是将请参数写入到请求正文中传递的。

2024-06-10 21:04:51 239

原创 QueryWrapper 和 LambdaQueryWrapper 的区别

QueryWrapper是一种通用的查询构造器,允许通过字符串形式直接指定数据库的字段名来构建查询条件。例如,queryWrapper.eq(“name”,“Alice”) 用于构建等于条件。优点是使用简单直接,适用于所有情况。缺点是它依赖于字符串字面量,这可能导致在数据库字段名更改时出现运行时错误,因为这些错误不会在编译时被捕捉到。

2024-06-06 16:00:11 291

原创 Mybatis-Plus的一些理解

MybatisPlus在Mybatis的基础上进行了增强,进一步简化了SQL的编写。对于普通的单表的CRUD,MyBatisPlus提过了相关接口进行快速操作。此外MybatisPlus还支持使用查询构造器。来进行一些复杂的查询。

2024-06-06 15:51:35 137

原创 对简单工厂模式、工厂方法模式、抽象工厂模式的简单理解

三部分组成把创建对象的任务交给一个工厂类来实现,对业务进行封装。优点:实现了任务分离,客户端不用关心业务的具体实现,交由工厂来“生产”。缺点:违背开闭原则,拓展时要修改工厂类。

2024-05-29 11:07:41 423

原创 mysql的inner join 和left join区别

INNER JOIN 只返回两个表中满足连接条件的匹配行。换句话说,它只返回那些在连接的两个表中都有匹配值的行。如果某一行在其中一个表中没有匹配项,那么这行不会出现在结果集中。

2024-05-28 20:36:25 557

原创 JWT下token过期的处理策略

最简单最直接的方式用户再次输入他们的登录凭证,如用户名和密码,得到一个新的token。

2024-05-28 09:53:50 532

原创 类图的六大关系

继承是一种类与类之间的关系,表示一种泛化和特化的关系。子类继承父类的特性和行为。关联关系是指两个类之间的链接,它使一个类知道另一个类的属性和方法。组合关系也是整体与部分的关系,但是部分不能脱离整体存在,依赖关系是一种使用关系,一个类的实现需要另一个类的帮助。实现关系是一个类实现接口的方法,体现了类与接口的关系。聚合关系是一种特殊的关联关映射,表示整体和部分的关系,但整体与部分不是强依赖的。

2024-05-25 11:45:03 361

原创 Java异常的捕获和抛出底层

当代码执行到一个会抛出异常的状态时,JVM会实例化一个相应的异常对象。这个对象包含了异常发生时的信息,如异常类型、错误消息、和堆栈跟踪。这些信息有助于开发者了解异常发生的环境和原因。

2024-05-24 14:24:52 218

原创 git常用命令

源自acwing

2024-05-23 21:32:15 291

原创 慢SQL分析

为什么会出现慢SQL?未用索引,就会造成全表扫描;又或者索引失效了单表数据量太大,导致加了索引也无济于事子查询过多(大量join会导致笛卡尔积后再筛选,所以大量join会导致大量运算使得sql变慢)怎么进行慢SQL分析启用慢查询日志,设置阈值,找到慢SQL执行explain sql, 分析sql执行计划,重点关注: type(ALL(全表扫描)、index(索引全扫描)),key(实际使用的索引)、key_len(索引长度)、rows(估计为了找到所需的行而必须检查的行数。)如何优化

2024-05-23 21:12:59 159

原创 Redis基本数据结构

embstr和raw类型的区别在于,RedisObject和embstr是连续存储的,只需要访存一次,而raw是分开存储的,需要访存两次。

2024-05-22 10:14:59 490

原创 Linux常用命令(面试)

chmod:改变文件或目录的权限。

2024-05-21 10:02:27 290

原创 Java反射

● 在运行时获取类的完整信息,从而操作类或对象的属性或方法。本质是JVM在得到class对象之后,通过class对象进行反编译,从而获取类的各种信息。● Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

2024-05-20 21:29:20 373

原创 ArrayList和Ventor的区别

它是专门为并发应用设计的,特别适合于在多线程环境中频繁读取但很少修改的情况。Collections.synchronizedList 是一个静态方法,它接受任何 List 实现(如 ArrayList、LinkedList 等),并返回一个新的 List 对象,该对象的所有方法都是通过一个单一的对象锁同步的。写时复制策略的核心思想是,每当列表发生修改操作(如添加、删除、设置等)时,不直接在当前的数组上修改,而是先复制出一个新的数组,然后在这个新的数组上进行修改,修改完成后再将原数组引用指向新数组。

2024-05-20 10:33:09 876

原创 接口和抽象类的区别

如果需要定义一个基类并希望它的子类继承它的特征,则应该使用抽象类。如果您希望多个类共享相同的特征和行为,则应该使用接口。● 接口不能定义普通方法,而抽象类可以定义普通方法以及方法的代码。● 接口一般只包含抽象方法,Java8之后允许可以定义默认方法。● 接口可以实现多个而抽象类只能单继承。

2024-05-19 21:25:35 293

原创 元空间和方法区有什么不同

元空间并不在虚拟机内存中,而是使用本地内存(即操作系统的内存)。元空间不再有字符串常量池和类静态变量池,这些内容被移到了堆中。● 类的结构信息、方法信息。

2024-05-19 21:23:34 131

原创 RabbitMQ消息的可靠性、顺序性和幂等性

如何保证消息队列消费的幂等性,这一块应该还是要结合业务来选择合适的方法,有以下几个方案:● 消费数据为了单纯的写入数据库,可以先根据主键查询数据是否已经存在,如果已经存在了就没必要插入了。或者直接插入也没问题,因为可以利用主键的唯一性来保证数据不会重复插入,重复插入只会报错,但不会出现脏数据。● 消费数据只是为了缓存到redis当中,这种情况就是直接往redis中set value了,天然的幂等性。

2024-05-19 21:17:42 894

原创 Java类加载过程

加载是一个读取class文件,通过【类加载器】将class文件装载到jvm中的方法区内,并在JVM堆中生成一个便于用户调用的java.lang.Class类型的对象的过程。对class的成员变量、静态变量、静态代码块的赋值,如果有【实例化对象】,则会调用方法对实例变量进行初始化,并执行对应的构造方法内的代码。类加载主要分为以下五个阶段。

2024-05-19 21:12:31 197

原创 最小小花费爬楼梯

【代码】最小小花费爬楼梯。

2024-05-19 21:03:50 181

原创 Github 操作指南

1、远程仓库拉取到本地2、定位到要上传的文件夹下面启动Git Bash3、添加要上传的文件git add4、提交合并更改5、推送确保本地仓库和远程仓库结构一致。

2024-05-18 21:40:13 438

原创 Java泛型

泛型是一种为了提高代码通用性和复用性的代码格式,它允许我们在编写类或方法、接口时不需要指定详细的数据类型,先用一个占位符代替。在平时开发中接触的泛型一般就是需要封装某个工具类时,如在统一前后端返回格式的时候,定义一个泛型类,允许传递不同的数据类型返回给前端。/*** 状态码*//*** 提示信息*//*** 返回的数据*/return msg;

2024-05-18 19:41:39 426

原创 Vue创建项目

4、配置Element-UI。● 在 main.js 中。

2024-05-17 21:27:02 125

原创 SpringBoot框架开发Maven配置通用模版参考

【代码】SpringBoot框架开发Maven配置通用模版参考。

2024-05-17 21:17:55 97

原创 SpringBoot前后端的交互过程

交互格式:json。

2024-05-17 21:16:24 883

原创 什么是ThreadLocal

ThreadLocal 为每一个线程提供独立的局部变量,每个线程都拥有该变量的一个独立副本。每个Thread里面都有一个ThrealLocal.ThreadLocalMap结构,里面由Entry数组组成。key是ThrealLocal,value是我们存的Object,当我们调用set的时候,就会去当前线程所持有的ThrealLocalMap放入一个k-v对,当我们调用get的时候,会去ThrealLocalMap中,找到当前ThrealLocal对象对应的value返回。

2024-05-14 20:16:25 261

原创 HTTP和HTTPS的区别和联系

HTTPS在HTTP的基础上引入了一个TLS层,采用密文进行传输,结合对称加密技术和非对称加密技术来实现数据的安全性和完整性。客户端会生成随机密钥,并使用服务端的公钥加密后再传给服务端。根据非对称加密算法,公钥加密的消息仅能通过私钥解密,这样服务端解密后,双方就得到了相同的密钥,再用它加密应用消息。(公钥如何获取:CA证书里)CA证书:保证密钥发售者身份的真实性非对称加密技术:保证消息不被冒充对称密钥传送:保证消息不被泄露为什么要采用非对称加密技术:保证密钥分发给通信双方的安全性。

2024-05-13 21:17:50 838

原创 Redisson分布式锁原理

而获取锁成功的线程在释放锁的时候,就会向等待中的线程发送一条消息,等待中的线程捕获到消息后,就可以重新尝试获取锁。每次获取锁时,先判断锁是否存在,如果不存在,则直接获取,如果已经存在,且线程标识为当前线程,则可以再次获取,并将重入次数加 1。释放锁时,每释放一次,重入次数减 1,直至重入次数减为 0,则证明所有的业务已经执行结束,则可以直接释放锁。整个过程是采用lua脚本实现的。简单来说,就是在获取锁成功后,会开启一个定时任务,该定时任务每隔一段时间就会重置锁的超时时间,这样锁的超时时间就会重新计时。

2024-05-12 11:03:47 216

原创 TCP连接涉及了哪些层

TCP连接建立的过程包括从请求方的传输层往下到物理层,再到接受方的物理层往上到传输层。可以把TCP连接建立的请求当成是一次不携带数据的网络请求,本质就是数据从一端发送到另外一端。这一层负责数据包从源到目的地的逻辑传输。在TCP连接过程中,每个TCP段都会被封装在一个IP数据包中,通过网络路由到目的地。这一层包括在物理网络上实际传输数据的协议和方法,如以太网。它负责在直接连接的节点之间传输IP数据包,处理错误检测和纠正,以确保数据包的物理传输。这是网络通信的最低层,负责原始数据(比特流)在物理媒介上的传输。

2024-05-11 20:13:27 183 1

原创 常量池和运行时常量池以及字符串常量池的区别

运行时常量池在类加载后被创建,它包括了类在编译期间静态生成的所有常量,以及运行期间动态生成的常量。运行时常量池具有动态性,不仅包括编译器编译的数据,还可能在运行时将新的常量放入池中,如String类的intern()方法。运行时常量池是常量池的运行时表示,属于方法区的一部分。每个加载到JVM的类或接口都有一个运行时常量池,用于存储编译期生成的各种字面量和符号引用的动态副本。如果不存在,新的字符串将被创建并放入池中。常量池是Java编译器生成的,存储在.class文件中的数据集合,它包含了类中所有的。

2024-05-10 10:09:17 262

原创 Java的BIO/NIO/AIO

每个客户端连连接本质上对应着一个Channel通道,每个通道都有自己的Buffer缓冲区来进行读写,这些Channel被Selector选择器管理调度Selector负责轮询所有已注册的Channel,监听到有事件发生,才提交给服务端线程处理,服务端线程不需要做任何阻塞等待,直接在Buffer里处理Channel事件的数据即可,处理完马上结束,或返回线程池供其他客户端事件继续使用。更好的性能:减少了线程数目,降低了系统对资源的需求,同时也减少了线程上下文切换的开销,这对于高性能服务器应用是非常重要的。

2024-05-08 15:46:03 1035

原创 TCP四次挥手

一开始客户端和服务端都是处于“ESTABLISHED”状态第一次挥手:客户端主动向服务端发送连接释放请求,FIN标志位设置为1,客户端进入”FIN_WAIT1“状态。第二次挥手:服务端向客户端发送确认请求,ACK标志位设置为1,此时TCP处于半关闭状态,服务端进入“CLOSE_WAIT"状态。客户端收到服务端端ACK报文后,进入”FIN_WAIT2“状态。此时还可以收到来自服务端的数据。

2024-04-27 11:25:17 378

原创 Servlet、Tomcat、Control区别

Servlet 是一种动态网站开发技术,专门用来处理客户端的请求并生成响应。Servlet直接与Tomcat交互,处理从Tomcat传来的请求。然后生成网页或其他类型的响应发送回Tomcat,Tomcat再将这些响应返回给用户的浏览器。

2024-04-26 19:28:05 385 1

空空如也

空空如也

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

TA关注的人

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