自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM知识点总结

知识点思维导图

2024-08-07 00:07:34 212

原创 Java八股文

Java

2024-08-06 23:42:07 180

原创 Java对象

关于深贝和浅贝区别,我这里先给结论浅拷贝:浅贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅贝会直接复制内部对象的引用地址,也就是说贝对象和原对象共用同一个内部对象深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。

2024-07-05 23:59:13 970

原创 Java 容器

java

2024-07-05 22:35:53 1086

原创 Java集合

顾名思义,Bitset是位集合,通常来说,位集合的底层的数据结构是一个bit数组,如果第n位为1,则表明数字r该数组中。举个例子,如果调用Bitset#set(10),业务语意是把10放到Bitset中,内部的操作则是通过把二进制的第十位(位)置为1。这样,就代表BitSet中包含了10这个数字。

2024-07-01 00:09:11 874

原创 Java 基础

Java泛型 (generics) 是JDK5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK5中的新集合类框架中。泛型的好处有两个:1.方便:可以提高代码的复用性。以List接口为例,我们可以将String、 Integer等类型放入List中,如不用泛型,存放String类型要写一个List接口,存放Integer要写另外一个List接口,泛型可以很好的解决这个问题。

2024-06-30 21:45:17 959

原创 使用IDEA进行Java代码调试

BUG调试

2024-04-12 15:37:28 423

原创 【算法面试题】-07

小朋友出操,按学号从小到大排成一列;小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。例如: 93,95,97,100,102,123,155 2、第二行:小明学号,如110;算法复杂度要求不高于nLog(n);学号为整数类型,队列规模<=10000;1、第一行:输入已排成队列的小朋友的学号 (正整数),以”,”隔开。输入93,95,97,100,102,123,155。输出一个数字,代表队列位置 (从1开始)例如: 6。

2024-03-12 22:46:12 635

原创 【算法面试题】-06

部门准备举办一场王者荣耀表演赛,有10名游戏爱好者参与,分5为两队,每队5人。例: 10名参赛者的评分分别为5 1 8 3 4 6 710 9 2,分组为 (135 8 10) (24 679),两组实力差最小,差值为1。现在,给你10位玩家的战斗力,请你把他们分为实力尽量相等的两组。n)进行标识,现需要按照身高由低到高排列, 对身高相同的人,按体重由轻到重排列;输出的第一个数字2表示此人原始编号为2,即身高为100,体重为30的这个人。由于他和编号为1的人身高一样,但体重更轻,因此要排在1前面。

2024-03-12 22:30:48 764

原创 【算法面试题】-05

第五步:将右边界的宝石价格加到总价中,sum=19,总价超过了你拥有的钱,所以将左边界的宝石价格从总价中减去,并将左边界向右移动,sum=13,right=4,left=1,max=4。第六步:将右边界的宝石价格加到总价中,sum=22,总价超过了你拥有的钱,所以将左边界的宝石价格从总价中减去,并将左边界向右移动,sum=21,right=5,left=2,max=4。第七步:继续将左边界的宝石价格从总价中减去,并将左边界向右移动,sum=18,right=5,left=3,max=4。

2024-03-10 23:51:00 1385

原创 【算法面试题】-04

有位客人来自异国,在该国使用m进制计数。该客人有个幸运数字n(n<m),每次购物时,其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。问:当其购买一个在我国价值k的产品时,其中包含多少幸运数字?输出幸运数字的个数,行末无空格。当输入非法内容时,输出0。k 表示 该客人购买的物品价值(以十进制计算的价格)m 表示 该客人所在国度的采用的进制。第一行输入为 k, n, m。n 表示 该客人的幸运数字。

2024-03-10 23:01:11 393

原创 【算法面试题】-03

【代码】【算法面试题】-03。

2024-03-10 18:16:36 240

原创 【面试题】-02

算法

2024-03-10 17:21:18 403

原创 【OD】算法二

第一行输入为N,表示开源项目的个数,0 < N <100。

2024-03-09 23:36:58 758

原创 华为OD算法

题目描述:字符串序列判定/最后一个有效字符输入两个字符串S和L,都只包含英文小写字母。S长度<=100,L长度<=500,000。判定S是否是L的有效子串。判定规则:S中的每个字符在L中都能找到(可以不连续),且S在L中字符的前后顺序与S中顺序要保持一致。(例如,S=”ace”是L=”abcde”的一个子序列且有效字符是a、c、e,而”aec”不是有效子序列,且有效字符只有a、e)输入描述输入两个字符串S和L,都只包含英文小写字母。S长度<=100,L长度<=500,000。

2024-03-02 23:34:14 894

原创 华为机试-算法一

算法

2024-02-27 22:23:38 853

转载 MySQL 锁篇(六)

两个事务即使生成的间隙锁的范围是一样的,也不会发生冲突,因为间隙锁目的是为了防止其他事务插入数据,因此间隙锁与间隙锁之间是相互兼容的。在执行插入语句时,如果插入的记录在其他事务持有间隙锁范围内,插入语句就会被阻塞,因为插入语句在碰到间隙锁时,会生成一个插入意向锁,然后插入意向锁和间隙锁之间是互斥的关系。互斥、占有且等待、不可强占用、循环等待,因此发生了死锁。

2023-12-09 20:07:13 179

转载 MySQL 锁篇(五)

可以看到,事务 B 的状态为等待状态(LOCK_STATUS: WAITING),因为向事务 A 生成的 next-key 锁(记录锁+间隙锁)范围(1005, +∞] 中插入了一条记录,所以事务 B 的插入操作生成了一个插入意向锁(LOCK_MODE: X,INSERT_INTENTION),锁的状态是等待状态,意味着事务 B 并没有成功获取到插入意向锁,因此事务 B 发生阻塞。有的读者问,MySQL 是怎么加锁的?就会阻塞,因为这条语句想加 X 型的锁,是与 S 型的锁是冲突的,所以就会被阻塞。

2023-12-09 18:09:19 175

转载 MySQL 锁篇(四)

首先来看看 MySQL 文档是怎么定义幻读(Phantom Read)的:翻译:当同一个查询在不同的时间产生不同的结果集时,事务中就会出现所谓的幻象问题。例如,如果 SELECT 执行了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 6 条行记录,那就发生了幻读的问题。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 4 条行记录,也是发生了幻读的问题。MySQL 是怎么解决幻读的?

2023-12-06 23:03:48 128

转载 MySQL 锁篇(三)

不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。当我们要执行 update 语句的时候,确保 where 条件中带上了索引列,并且在测试机确认该语句是否走的是索引扫描,防止因为扫描全表,而对表中的所有记录加上锁。我们可以打开 MySQL sql_safe_updates 参数,这样可以预防 update 操作时 where 条件没有带上索引列。

2023-12-06 22:45:37 82

转载 MySQL 锁篇(二)

这次我以 MySQL 8.0.26 版本,在可重复读隔离级别之下,做了几个实验,让大家了解了唯一索引和非唯一索引的行级锁的加锁规则。我这里总结下, MySQL 行级锁的加锁规则。当查询的记录是「存在」的,在索引树上定位到这一条记录后,将该记录的索引中的 next-key lock 会退化成「记录锁」。当查询的记录是「不存在」的,在索引树找到第一条大于该查询记录的记录后,将该记录的索引中的 next-key lock 会退化成「间隙锁」。

2023-12-06 22:36:48 178

转载 MySQL 锁篇(一)

但不论是哪一种,这个 binlog 拿去「从库」执行,这时从库是按「顺序」执行语句的,只有当执行完一条 SQL 语句后,才会执行下一条 SQL。那么有了「意向锁」,由于在对记录加独占锁前,先会加上表级别的意向独占锁,那么在加「独占表锁」时,直接查该表是否有意向独占锁,如果有就意味着表里已经有记录被加了独占锁,这样就不用去遍历表里的记录。如果在全库逻辑备份期间,有用户购买了一件商品,一般购买商品的业务逻辑是会涉及到多张数据库表的更新,比如在用户表更新该用户的余额,然后在商品表更新被购买的商品的库存。

2023-12-03 23:05:08 49

原创 MySQL 中的锁(三)

死锁的发生必须具备以下四个必要条件。1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

2023-11-29 23:05:48 1052

原创 MySQL 中的锁(二)

比方说在 Session 1 中对一个表执行 SELECT 操作,就相当于为这个表加了一个表级别的 S 锁,如果在 SELECT 操作未完成时,Session 2 中对这个表执行UPDATE 操作,相当于要获取表的 X 锁,此操作会被阻塞,直到 Session 1 中的SELECT 操作完成,释放掉表级别的 S 锁后,Session 2 中对这个表执行 UPDATE 操作才能继续获取 X 锁,然后执行具体的更新语句。就是说其实 IS 锁和 IX 锁是兼容的,IX 锁和 IX 锁是兼容的。

2023-11-29 22:34:16 1099

原创 MySQL 中的锁(一)

我们说幻读问题的产生是因为当前事务读取了一个范围的记录,然后另外的事务向该范围内插入了新记录,当前事务再次读取该范围的记录时发现了新插入的新记录,我们把新插入的那些记录称之为幻影记录。有的时候楼层会进行检修,比方说换地板,换天花板,检查水电啥的,这些维修项目并不能同时开展。不可重复读的产生是因为当前事务先读取一条记录,另外一个事务对该记录做了改动之后并提交之后,当前事务再次读取时会获得不同的值,如果在当前事务读取记录时就给该记录加锁,那么另一个事务就无法修改该记录,自然也不会发生不可重复读了。

2023-11-29 21:25:27 1067

转载 Redis功能篇(一)

Redis 使用的过期删除策略是「惰性删除+定期删除」,删除的对象是已过期的 key。

2023-11-26 21:54:12 42

转载 Redis 数据结构底层原理(六)

于是,Redis 在 5.0 新设计一个数据结构叫 listpack,目的是替代压缩列表,它最大特点是 listpack 中每个节点不再包含前一个节点的长度了,压缩列表每个节点正因为需要保存前一个节点的长度字段,就会有连锁更新的隐患。在前面讲压缩列表的时候,我也提到了压缩列表的不足,虽然压缩列表是通过紧凑型的内存布局节省了内存开销,但是因为它的结构设计,如果保存的元素数量增加,或者元素变大了,压缩列表会有「连锁更新」的风险,一旦发生,会造成性能下降。我画了一张图,方便你理解 quicklist 数据结构。

2023-11-26 15:28:08 41

转载 Redis 数据结构底层原理(五)

Zset 对象在使用跳表作为数据结构的时候,是使用由「哈希表+跳表」组成的 struct zset,但是我们讨论的时候,都会说跳表是 Zset 对象的底层数据结构,而不会提及哈希表,是因为 struct zset 中的哈希表只是用于以常数复杂度获取元素权重,大部分操作都是跳表实现的。因为跳表中的节点都是按序排列的,那么计算某个节点排位的时候,从头节点点到该结点的查询路径上,将沿途访问过的所有层的跨度累加起来,得到的结果就是目标节点在跳表中的排位。这样的好处是既能进行高效的范围查询,也能进行高效单点查询。

2023-11-26 15:17:43 41

转载 Redis 数据结构底层原理(四)

整数集合会有一个升级规则,就是当我们将一个新元素加入到整数集合里面,如果新元素的类型(int32_t)比整数集合现有所有元素的类型(int16_t)都要长时,整数集合需要先进行升级,也就是按新元素的类型(int32_t)扩展 contents 数组的空间大小,然后才能将新元素加入到整数集合里,当然升级的过程中,也要维持整数集合的有序性。比如前面的升级操作的例子,如果删除了 65535 元素,整数集合的数组还是 int32_t 类型的,并不会因此降级为 int16_t 类型。因此,整数集合升级的好处是。

2023-11-26 14:34:45 34

转载 Redis 数据结构底层原理(三)

另外,这里还跟你提一下,dictEntry 结构里键值对中的值是一个「联合体 v」定义的,因此,键值对中的值可以是一个指向实际值的指针,或者是一个无符号的 64 位整数或有符号的 64 位整数或double 类的值。另外,在渐进式 rehash 进行期间,新增一个 key-value 时,会被保存到「哈希表 2 」里面,而「哈希表 1」 则不再进行任何添加操作,这样保证了「哈希表 1 」的 key-value 数量只会减少,随着 rehash 操作的完成,最终「哈希表 1 」就会变成空表。

2023-11-26 14:16:35 29

转载 Redis 数据结构底层原理(二)

这两种数据结构的设计目标,就是尽可能地保持压缩列表节省内存的优势,同时解决压缩列表的「连锁更新」的问题。因为 e1 节点的 prevlen 属性只有 1 个字节大小,无法保存新节点的长度,此时就需要对压缩列表的空间重分配操作,并将 e1 节点的 prevlen 属性从原来的 1 字节大小扩展为 5 字节大小。压缩列表的最大特点,就是它被设计成一种内存紧凑型的数据结构,占用一块连续的内存空间,不仅可以利用 CPU 缓存,而且会针对不同长度的数据,进行相应编码,这种方法可以有效地节省内存开销。

2023-11-26 10:46:15 32

转载 Redis 数据结构底层原理(一)

Redis 为什么那么快?除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理。因此,这次我们就来好好聊一下 Redis 数据结构,这个在面试中太常问了。

2023-11-26 10:27:37 43

原创 Spring底层篇

Spring: 是一个企业级java应用框架,他的作用主要是简化软件的开发以及配置过程,简化项目部署环境。Spring的有点:1、Spring低侵入设计,对业务代码的污染非常低。2、Spring的DI机制将对象之间的关系交由框架处理,减少组件的耦合。3、Spring提供了AOP技术,支持将一些通用的功能进行集中式管理,从而提供更好的复用。4、Spring对于主流框架提供了非常好的支持。IOC就是控制反转,指创建对象的控制权转移给Spring来进行管理。

2023-11-26 09:21:51 1327

转载 Redis数据类型(一)

我们都知道 Redis 提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。每种数据对象都各自的应用场景,你能说出它们各自的应用场景吗?

2023-11-25 23:05:37 27

原创 MySQL 事务的底层原理和 MVCC(二)

这个阶段称之为 purge。在聚簇索引中,记录是按照主键值的大小连成了一个单向链表的,如果我们更新了某条记录的主键值,意味着这条记录在聚簇索引中的位置将会发生改变,比如你将记录的主键值从 1 更新为 10000,如果还有非常多的记录的主键值分布在 1 ~ 10000 之间的话,那么这两条记录在聚簇索引中就有可能离得非常远,甚至中间隔了好多个页面。更新记录时,对于被更新的每个列来说,如果更新后的列和更新前的列占用的存储空间都一样大,那么就可以进行就地更新,也就是直接在原记录的基础上修改对应列的值。

2023-11-22 23:07:38 1507 1

原创 MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上,MySQL 采用的是 WAL(Write-ahead logging,预写式日志)机制来实现的。在使用 WAL 的系统中,所有的修改都先被写入到日志中,然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。为什么需要使用 WAL,然后包含 redo 和 undo 信息呢?举个例子,如果一个系统直接将变更应用到系统状态中,那么在机器掉电重启之后系统需要知道操作是成功了,还是只有部分成功或者是失败了(为了恢复状态)。

2023-11-22 22:41:57 707

原创 MySQL InnoDB 引擎底层解析(三)

InnoDB 的内存结构和磁盘存储结构图总结如下:其中的 Insert/Change Buffer 主要是用于对二级索引的写入优化,Undo 空间则是 undo 日志一般放在系统表空间,但是通过参数配置后,也可以用独立表空 间存放,所以用虚线表示。

2023-11-22 21:41:21 416

原创 MySQL InnoDB 引擎底层解析(三)

InnoDB 的内存结构和磁盘存储结构图总结如下:其中的 Insert/Change Buffer 主要是用于对二级索引的写入优化,Undo 空间则是 undo 日志一般放在系统表空间,但是通过参数配置后,也可以用独立表空 间存放,所以用虚线表示。

2023-11-21 23:01:57 673

原创 MySQL InnoDB 引擎底层解析(二)

扫描全表意味着什么?存放叶子节点的区的集合就算是一个段(segment),存放非叶子节点的区的集合也算是一个段。原则上只要一个表中的 row_id 列不重复就可以了,也就是说表 a 和表 b 拥有一样的 row_id 列也没啥关系,不过 InnoDB 只提供了这个 Max Row ID 字段,不论哪个拥有 row_id 列的表插入一条记录时,该记录的 row_id 列的值就是 Max Row ID 对应的值,然后再把 Max Row ID 对应的值加 1,也就是说这个 Max Row ID是全局共享的。

2023-11-21 22:59:33 315

原创 MySQL InnoDB 引擎底层解析(一)

File Header 针对各种类型的页都通用,也就是说不同类型的页都会以 File Header 作为第一个组成部分,它描述了一些针对各种页都通用的一些信息,比方说页的类型,这个页的编号是多少,它的上一个页、下一个页是谁,页的校验和等等,这个部分占用固定的 38 个字节。InnoDB 为了不同的目的而设计了许多种不同类型的页,存放我们表中记录的那种类型的页自然也是其中的一员,官方称这种存放记录的页为索引(INDEX)页,不过要理解成数据页也没问题,毕竟存在着聚簇索引这种索引和数据混合的东西。

2023-11-19 22:01:06 473

空空如也

空空如也

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

TA关注的人

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