自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 274、H指数

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h。如果 h 有多种可能的值,h 指数 是其中最大的那个。示例 1:输入:citations = [3,0,6,1,5]输出:3。

2025-05-12 17:10:00 382

原创 45、跳跃游戏Ⅱ

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:i + j < n返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。示例 1:输入: nums = [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。

2025-05-12 14:18:03 223

原创 55、跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true;否则,返回 false。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。

2025-05-12 12:10:30 125

原创 122、买卖股票的最佳时机2

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润。示例 1:输入:prices = [7,1,5,3,6,4]输出:7解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。

2025-05-12 10:02:10 231

原创 121、买卖股票最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。

2025-05-08 17:20:57 224

原创 189、轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

2025-05-07 18:24:38 176

原创 169.多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

2025-05-07 12:08:05 175

原创 80、删除有序数组中的重复项Ⅱ

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

2025-05-07 11:53:24 128

原创 26、删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k。

2025-05-07 11:47:54 214

原创 27、移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。返回 k。

2025-05-07 11:40:51 217

原创 88、合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n。

2025-05-07 11:32:59 278

原创 Spring超全总结

控制反转是一种设计思想,就是将我们手动创建对象的控制权交给Spring框架来管理,由Spring负责对象生命周期和对象间的依赖关系。Spring IoC容器就像是一个工厂,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。4.Spring中的DI依赖注入是什么?依赖注入是IOC的一种实现方式,通过将依赖对象注入到目标对象来实现解耦。通过依赖注入,我们只需要简单的配置就能获取所需要的资源,完成自身的业务逻辑。不需要关心具体的资源来自何处,由谁实现。

2025-04-17 13:27:07 919

原创 Java基础-超全总结

Java动态代理是一种允许运行时创建代理对象的机制,可以在不修改原始类的情况下,为其添加额外的行为。比如日志记录性能监控等。动态代理的核心是反射技术,当代理对象的方法被调用时,的invoke()方法就会被触发,在里面定义方法调用的增强行为。在Java中也有静态代理,静态代理就是预先编译好一个代理类。Java中的动态代理只能对接口进行代理,不能对类进行代理。CGLIB动态代理是通过字节码技术生成目标类的子类来实现代理,可以支持对类的代理。

2025-04-15 14:20:02 859

原创 Java-泛型、反射、注解和序列化

所有的注解都是使用元注解生成的,表示这个注解是可以被继承的。,用来描述被标记数据的。

2025-04-14 15:32:46 1020

原创 Java-异常

在捕获处理异常时,注意不要在。不应该被程序捕获处理。代码块里处理返回值,

2025-04-14 15:21:52 177

原创 Java-String

如果要修改类,就会返回副本(新对象)。我们常见的String类就是不可变类。方法重写了Object的equals方法,比较的是。不可变类是初始化之后不能被修改的类,

2025-04-14 15:18:46 147

原创 Java-面向对象

假如B和C继承了A,但是对A中的方法有不同的实现,此时D同时继承了B和C。在object类中基于内存地址计算哈希值,可以快速比较两个对象是否相等,如果两个对象的哈希值不相等,那么这两个对象一定不相等,常用于。浅拷贝性能开销较小,仅复制对象的引用,深拷贝性能开销大,因为要创建新的对象实例。面向过程是将解决问题的参与者,封装成一个个对象,每个对象完成自己的操作。对象实体是内存中真实存在的对象实例,对象引用是指向对象实体的指针。对象相等比较的是值是否相等,引用相等比较的是内存地址是否相等。

2025-04-14 15:15:04 242

原创 Java-方法

Java中的参数传递都是值传递,不过基本类型传递的是值的副本,对其修改会影响外部。引用类型传递的是地址值,方法内部修改对象属性会影响到外部,但是不能修改引用本身使其指向其他的对象。类没有声明构造方法,程序也能正确执行,因为默认提供类的。在创建对象时,构造方法会自动执行。,以便于初始化不同对象。,没有返回类型且不能用。

2025-04-14 15:03:55 224

原创 Java-变量

类变量实例变量static所有对象实例共享分配一次内存staticstatic。

2025-04-14 14:56:42 207

原创 Java-类

启动类加载器是最顶层包含一些核心类库,包括String类和线程类等,当我们加载java.lang.String的时候就先交给启动类加载器加载。类的加载过程需要涉及到类加载器,JVM在运行的时候会产生三个类加载器,这三个类加载器组成一个层级关系,每个类加载器分别去加载不同范围的jar包。内部类就是在一个类的内部再定义一个类,分为四种,成员内部类、静态内部类、局部内部类和匿名内部类。应用类加载器的父类加载器是扩展类加载器,扩展类加载器的父类是启动类加载器。机制是当一个类加载器去加载某个类的时候,会。

2025-04-14 14:26:13 431

原创 Java-基本数据类型

自动装箱拆箱虽然简化了代码,但是在频繁使用的场景下开销比较大。尤其在循环中发生装箱和拆箱时,容易引起不必要的对象创建和垃圾回收。需要注意的是,在进行拆箱时,如果包装类型对象为。自动装箱就是Java编译器自动将基本类型转换为对应的包装类型,自动拆箱就是Java编译器将包装类型转换为对应的基本类型。自动装箱和拆箱主要是提高代码的可读性,减少手动转换操作。Java中有四类八种基本的数据类型,四类数据类型包括整型、浮点型、字符型、布尔型。无限循环的小数存储在计算机时,只能被截断,所以就会导致精度损失。

2025-04-14 02:30:52 222

原创 MySQL-锁

给记录加锁,一致性要求强。快照读是读取快照信息,在读已提交的情况下读取的是最新的快照信息,在可重读读的情况下读取的是事务开始时的快照信息。,用于协调表锁和行锁之间的关系。在事务加了行锁的情况下,判断是否还需要加表锁。意向锁是由数据引擎自己维护的,用户无法手动操作。InnoDB中主要有三种行锁,分别是。

2025-04-13 02:48:54 250

原创 MySQL-事务

在读已提交的事务隔离级别中,每次查询都会生成一个ReadView。而在读已提交的隔离级别中,相同的查询只会生成一个ReadView。临键锁是记录锁和间隙锁的集合,记录锁只能锁定一行数据,也就是记录本身。间隙锁锁定一个范围,不包含记录本身,可以避免插入新数据。那么临键锁就是锁定一个范围,包括记录本身,这样就可以解决幻读的问题。,MVCC是多版本并发控制,存储多个版本的数据。锁根据粒度不同分为行锁和表锁,行锁就是对一行或多行数据加锁,表锁就是对整张数据库表加锁。,undolog保存的是。未提交事务的最小ID。

2025-04-13 02:46:30 352

原创 MySQL-日志文件

redolog buffer存放在内存中,当内存中的buffer poll中的数据页发生变化时就会同步到redolog buffer中。然后,redolog buffer中的数据再同步到磁盘中的redolog file文件中。redolog重做日志,记录事务提交时数据页的物理修改。而一行redolog记录只占几十字节,支持顺序I/O,刷盘性能非常好。,主要用于记录数据发生的变化,用于主从同步。redolog是重做日志,记录数据的。undolog是回滚日志,记录的是数据的。MySQL中的日志文件有错误日志、

2025-04-13 02:39:25 248

原创 MySQL-存储引擎和索引

创建的索引,相比于单列索引,每个索引对应一颗B+树,而联合索引只需要一颗B+树。我们在使用联合索引的时候,将区分度最高的字段放到左边,这样可以过滤更多的数据。如果我们使用主键进行查询,那么就会采用聚簇索引返回所有字段的数据,这就是覆盖索引查询。非聚簇索引不一定回表查询,比如查询用户名,用户名正好建立了索引,直接返回就可以。MySQL中的存储引擎是插件式的,可以为不同的数据库表设置不同的存储引擎。覆盖索引就是查询使用了索引,返回的字段必须在索引中全部找到。聚簇索引就是将主键做为索引,只能有。

2025-04-13 00:47:18 518

原创 Redis-集群

Redis Cluster就是部署多台Redis主节点,这些节点之间平等没有主从之说,同时对外提供。单节点的Redis并发能力是有限的,要想进一步提高Redis的并发能力就要搭建集群,实现。主从复制有一个缺点,不能保证redis的高可用,主节点宕机后就丧失了写数据的能力。哨兵会监听主从节点的状态,当master节点发生故障的时候,会自动从剩下的slave节点中一个新的master。,主节点负责写操作,从节点负责读操作。来实现的,共识算法就是让分布式系统中的节点就某个问题达到共识。主节点的自动故障恢复。

2025-04-12 02:44:56 341

原创 Redis-出现的问题

设置了过期时间,当Key过期的时候,恰好这时间点对这个Key有大量的并发请求,这些大量并发的请求可能会瞬间把数据库压垮。对于过期key,Redis采用的是定期删除+惰性删除。但是针对于大量key集中过期,可以给key。机制,Redis会在后台异步删除过期的key,不会阻塞主线程的运行。或者缓存服务器宕机,导致大量的请求访问数据库,对数据库造成很大压力。,这将导致据每次请求都要到数据库去查询,对数据库造成了巨大的压力。遇到过缓存击穿的问题,在给热门商品信息设置了过期时间。

2025-04-12 02:37:07 216

原创 Redis-事务

Redis的设计更倾向于性能,而不是为了像数据库一样,保证事务的一致性而且牺牲性能。Redis的事务用的并不多,通过Lua脚本也可以保证多个命令执行的原子性,并且性能还会更好。因为通过Lua脚本,它会将多个命令打包,一起放到Redis的服务端进行执行。,这些队列中的命令才会执行。在这个过程中如果某一个命令发生异常,不会导致所有的命令回滚,而是忽略异常命令,继续执行其它命令。数据库的事务就是开启事务,然后执行数据库的一系列操作,如果没有异常就会提交事务,如果出现异常就会回滚事务。

2025-04-12 02:32:37 318

原创 Redis-内存

Redis先采用定期删除每隔一段时间就抽取一定数量的key来检查和删除,然后采用惰性删除,在获取key的时候,redis会检查key是否过期,然后删除。这样即对内存友好,又对CPU友好。Redis在过期字典中保存数据过期时间,查询key的时候首先判断是否在过期字典中,如果没有的话直接返回,如果存在的话需要判断key是否过期。的时候对过期时间进行检查,这种方式对CPU友好,但是对内存不友好,可能出现大量的过期key没有被访问,从而不会被删除。子进程完成重写之后,会将重写缓冲区的命令写入到新的AOF文件中。

2025-04-12 02:29:56 411

原创 Redis-数据类型

属性,检查空间大小是否满足,如果不满足就会动态扩充。SDS获取字符串长度的时间复杂度是O(1),直接获取len属性的值即可。String可以存储各种类型的数据,比如:整数、字符串、浮点数和图片等。如果List为空,Redis服务器会等List中有新数据或者等待超时之后返回。如果对象中某些字段经常变化或查询,使用Hash存储很适合。同时Hash比String更节省空间,特别是字段较多且长度较短时。简单动态字符串,SDS可以避免缓冲区溢出,在修改字符串的时候会先判断。,用在不能重复的场景。(存放0、1数组)、

2025-04-12 02:22:33 246

原创 Redis-分布式锁

选取的新的主节点就会再次获取锁,这就不满足锁的互斥性了。唯一的key使用:用户token+商品的url和重复提交的key,保证当前用户当前商品重复下单操作只能提交一次,其他通过setNX保存失败的都忽略掉。Reids实现的分布式锁是不可以重入的,但是Redission实现的分布式锁是可以重入的。,当重入次数大于0时,需要判断该占有锁的线程和请求获取锁的线程是否为同一个,如果是同一个就将重入次数加1。这样主节点宕机之后,就不能在其它节点上加锁了,红锁的实现复杂,性能很差。当用户下单的时候,可以通过。

2025-04-12 02:17:05 347

原创 Redis-基本概念

Reids是非关系型数据库,主要用于分布式缓存。由于数据存储在内存,所以速度很快。Redis支持五种基本的数据类型分别是StringListSetZSet和Key-Value键值对。Redis是单线程,I/O多路复用。2.除了Redis还知道哪些分布式缓存吗?除了Redis还有Memcached,Redis和Memcached都是基于内存的数据库,速度都很快。Memcached只支持Key-Value数据类型,而Redis支持多种数据类型。Memcached将全部的数据存储在内存中,不支持数据持久化。

2025-04-12 02:12:04 441

原创 RabbitMQ

RabbitMQ为了保证MQ的可靠性,采用数据持久化,包括交换机持久化、队列持久化和消息持久化,都是需要配置Durability属性来开启持久化的。RabbitMQ通过convertAndSend方法来发送消息,第一个参数为交换机名,第二个参数为routingKey,第三个参数为发送的消息。可能出现消息丢失的场景分别是生产者发送消息时消息丢失、MQ宕机导致消息丢失,消费者处理消息时抛异常导致消息丢失。采用确认机制和重试机制中,很有可能出现同一个消息被重复消费的可能,可以采用唯一ID的方式来保证幂等性。

2025-04-12 01:56:40 1239

原创 SpringCloud - 分布式事务

由于单体事务在不同的微服务中,无法保证全局事务的ACID特性。比如创建订单成功,购物车页清理成功了,但是扣减库存失败,此时购物车中的商品信息也清空了,无法回滚。其中TC可以协调全局事务提交回滚,TM向TC报告方法的开始和结束,RM负责管理分支事务提交或回滚。,我们项目中使用的是AT,在这里主要讲下XA和AT,XA和AT都是采用两阶段提交来解决分支事务问题。是解决分布式事务的中间件,Seata事务管理有三个重要的角色,分别是。Seata中提供了四种不同的分布式事务解决方案,分别是。

2025-04-12 00:54:00 195

原创 SpringCloud-服务熔断降级

由于我们的查询购物车和修改购物车都属于购物车微服务里,查询购物车需要调用商品服务,如果商品服务出现故障,查询购物车业务就会等待商品服务返回。如果查询购物车的请求太多,那么就会将购物车服务压垮,导致雪崩。由于修改购物车业务在购物车服务中,修改购物车请求也会失败。所有我们就用Sentinel对查询购物车和修改购物车做了线程隔离。查询购物车失败的时候,如果没有查询到最新的商品信息。这样在购物车查询失败的时候,修改购物车业务不会受到影响。在项目中查询购物车和修改购物车中用到了。

2025-04-12 00:50:11 132

原创 Spring Cloud网关

客户端的请求先通过匹配规则找到合适的路由,就能映射到具体的服务。然后请求经过过滤器处理后转发给具体的服务,服务处理后,再次经过过滤器处理,最后返回给客户端。先将路由信息添加到Nacos配置中,当路由配置信息发生变更的时候就推送到网关。如何在网关和微服务之间传递用户信息?客户端的请求先经过路由匹配规则找到合适的路由,映射到具体的服务上。然后,请求经过过滤器处理转交给具体的服务,服务处理后再经过过滤器返回给客户端。路由断言就是客户端发送的请求满足断言之后,就会映射到指定的路由器,然后转发到指定的微服务。

2025-04-12 00:46:15 1172

原创 Spring Cloud-负载均衡

主要的负载均衡算法有四种,分别是随机法、轮询法、哈希法和最小连接法。

2025-04-12 00:04:20 276

原创 Spring Cloud 远程调用

在启动类上添加@EnableFeignClients注解,这个注解会扫描所有标注@FeignClient注解的接口,并创建远程代理对象,将这些代理对象添加到Spring容器中。微服务间的远程调用可以分为两种,第一种采用Nacos服务注册发现,然后RestTemplate实现远程调用,这种方式比较麻烦。实现微服务间的远程调用主要有两种方式,第一种是先通过Nacos服务注册发现获取到服务实例列表,然后通过RestTemplat实现远程调用。在使用OpenFeign的时候,主要关心两个注解,

2025-04-12 00:02:02 493

原创 Sping Cloud配置和注册中心

Nacos通过心跳监测来检查服务实例是否异常,如果定期时间内没有返回心跳,就将服务实例设置为不可用。注册中心会将服务实例列表发送给Nacos客户端,Nacos客户端会根据本地的负载均衡算法选择一个实例调用。Nacos实现配置共享和热更新时,首先将配置信息添加到Nacos中,然后在bootstrap.yaml文件中拉取共享配置。Nacos采用长轮询的方式来检查配置信息变更,如果服务端配置信息没变更,连接就会一直打开。如果服务端的配置信息发生变更,就将变更的配置信息拉取到本地。

2025-04-11 23:49:14 358

原创 MyBatis(2)

动态SQL可以根据具体的参数,对SQL语句进行拼接。标签用来做迭代拼接,通常会与SQL语句中的IN查询条件结合使用。一个班级对应多个学生,也就是班级类中有一个学生集合属性,这就是一对多关系。属性则为需要迭代的集合,由于入参是个List,所以参数名必须为list。一个学生对应一个班级,也就是学生类中有一个班级属性,这就是一对一关系。标签只会在至少有一个子元素返回了SQL语句时,才会向SQL语句中添加。标签用来将重复的SQL片段提取出来,然后在需要的地方,使用。,后面在引用时,参数名必须为。

2025-04-11 02:21:20 562

空空如也

空空如也

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

TA关注的人

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