- 博客(83)
- 收藏
- 关注
原创 124. 二叉树中的最大路径和
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。当前节点的最大路径: max(自己,自己+左边,自己+右边,自己 + 左边 + 右边)当前节点作为子节点时的贡献:max(自己,自己+左边,自己+右边)给你一个二叉树的根节点 root ,返回其 最大路径和。路径和 是路径中各节点值的总和。当前节点作为子节点时的贡献。
2024-06-16 21:04:41
424
原创 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
原创 类图的六大关系
继承是一种类与类之间的关系,表示一种泛化和特化的关系。子类继承父类的特性和行为。关联关系是指两个类之间的链接,它使一个类知道另一个类的属性和方法。组合关系也是整体与部分的关系,但是部分不能脱离整体存在,依赖关系是一种使用关系,一个类的实现需要另一个类的帮助。实现关系是一个类实现接口的方法,体现了类与接口的关系。聚合关系是一种特殊的关联关映射,表示整体和部分的关系,但整体与部分不是强依赖的。
2024-05-25 11:45:03
361
原创 Java异常的捕获和抛出底层
当代码执行到一个会抛出异常的状态时,JVM会实例化一个相应的异常对象。这个对象包含了异常发生时的信息,如异常类型、错误消息、和堆栈跟踪。这些信息有助于开发者了解异常发生的环境和原因。
2024-05-24 14:24:52
218
原创 慢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
原创 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
原创 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
原创 什么是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关注的人