- 博客(82)
- 收藏
- 关注
原创 八股训练营第 35 天 | volatile 关键字的作用有那些?volatile 与synchronized 的对比?JDK8 有哪些新特性?
volatile 会发出 lock 指令对当前 cpu 缓存进行上锁,这样就会让当前 cpu 独占缓存,让其他 cpu 的此缓存段失效,因为加了 lock,接下来操作的指令会独占数据写回主存和缓存,其他 cpu 因为缓存失效就会去主存读数据重新写入缓存,就保证了不同 cpu 之间的缓存一致性。volatile 变量禁止指令重排序。针对 volatile 修饰的变量,在读写操作指令前后会插入内存屏障,指令重排序时不能把后面的指令重排序到内存屏障.volatile 关键字确保变量在多个线程的可见性。
2025-12-02 23:06:55
105
原创 八股训练营第 34 天 | synchronized 和 Lock 的区别是什么?synchronized 和 ReentrantLock 的区别是什么?
2025-12-01 22:30:29
241
原创 代码随想录算法训练营第 52 天 | 106. 岛屿的周长、110. 字符串接龙、105. 有向图的完全联通
无权图求最短路径,不需要迪杰特斯拉算法,只需要 dfs 或 bfs 即可。抽象图用 graph,二维图用 grid。邻接矩阵用graph[][],邻接表用。// 节点数量// 边数量// 节点数量// 边数量i < n + 1;i++) { // i 必须从 0 开始,创建 n + 1 个空列表。
2025-12-01 16:54:54
408
原创 八股训练营第 32 天 | 你知道 Java 中有哪些锁吗?说一说你对 synchronized 的理解?
引入了偏向锁、轻量级锁和重量级锁。当一个锁对象第一次被某个线程进入时,这个时候由于没有发送锁竞争,此时是偏向锁,线程可以直接获得锁对象。当出现别的线程也要竞争这个锁时,就会升级成轻量级锁。synchronized 的本质是获取某个对象的监视器锁(monitor lock)。线程要进入同步代码块,必须先获得指定的锁。锁是属于对象的,而不是属于代码的。当修饰代码块时,只有代码块被锁定。当修饰方法时,锁定的是 this 实例对象。当修饰代码块时,需要显示地指定锁定的对象。当修饰的是静态方法时,锁定是整个类对象。
2025-12-01 00:40:15
108
原创 代码随想录算法训练营第 51 天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 高山流水、104. 建造最大岛屿
遍历第一行、最后一行、第一列、最后一列。遇到陆地就将它相邻的所有陆地都标记为 0(省去 visited 数组)。最后统计 grid 有多少个 1。被标记为 true 的节点不会再次访问。必须先把 1 变为 0,再把 2 变为 1,否则会覆盖导致数组全为 0。暴力方法:每个海洋都尝试变成陆地,然后统计最大岛屿面积。代码以 dfs 为例:dfs 很简单,主函数有点复杂。暴力时间复杂度:O(n * m * n * m)注意:题目要求的是孤岛总面积而不是孤岛个数。时间复杂度:O(n * m * n * m)
2025-11-30 23:40:14
811
原创 八股训练营第 31 天 | Java 创建线程有哪几种方式?线程start和run的区别?
因此,虽然可以直接调用 run 方法,但这并不会创建一个新线程,而是在当前线程中执行。要想实现多线程执行,则必须调用 start 方法开启一个新线程。
2025-11-29 23:54:06
124
原创 代码随想录算法训练营第 50 天 | 99. 岛屿数量、100. 岛屿的最大面积
遍历每个地方,如果该处为陆地,且未访问过。将结果加 1.并将该处所连的陆地全部标记为已访问。dfs ——先格子赋值为 true,再进入 dfs 函数。(dfs 隐式终止条件)dfs ——判断完终止条件后,再赋值为 true。(dfs 显式终止条件)重点:队列刚一放进去元素,visited 数组就要立马标记为 true。dfs 或 bfs 时,可以只搜右下的格子。
2025-11-28 23:51:58
653
原创 代码随想录算法训练营第 49 天 | 98. 可达路径 / 797. 所有可能的路径
注意:有向无环图不需要 visited 数组。需要提前在 path 中把节点 1 加上。,在 Java 中为锯齿数组。(因为节点从 1 到 n)LeetCode 模式。
2025-11-28 00:07:54
201
原创 八股训练营第 29 天 | HashMap 为什么是线程不安全的? 如何实现线程安全?concurrentHashMap 如何保证线程安全?HashMap和ConcurrentHashMap的区别?
HashMap 内部的 get、put、自动扩容方法都不是原子性的。但有多个读写线程并发执行的情况下,就可能会出现数据不一致或者抛出异常。比如出现元素丢失、元素覆盖等情况。元素丢失:一个读线程和一个写线程并发运行。读线程已经确定了元素在数值中的位置,正要提取元素。这时写线程运行了,它往 HashMap 中插入了一个元素导致 HashMap 扩容。这导致读线程原本要读的元素在数组中的位置恰好因为扩容转移到了一个新的位置。这时读线程运行,它还读它之前计算出的那个位置。导致读到的是 null。
2025-11-27 00:01:40
377
原创 代码随想录算法训练营第 48 天 | 42. 接雨水、84. 柱状图中最大的矩形
创建两个数组,分别表示当前柱子左边最高柱子(包括自身)的高度和右边最高柱子(包括自身)的高度。根据木桶效应,某个位置能装的水的高度为左边最高柱子高度和右边最高柱子高度的最小值。但是知道它右边某个柱子的右边最高柱子高度是大于上面已经求出来的左边最高柱子的高度。左边最高柱子高度 = 它左边柱子的左边最高柱子的高度和它本身高度,取最大值。高度为右边更高的柱子和左边更高的柱子的最小值,还要减去当前柱子的高度!某个位置,已经知道它左边最高柱子的高度,它右边最高柱子的高度还没求。空间复杂度:O(n)
2025-11-26 22:00:21
1416
原创 八股训练营第 28 天 | HashMap 的底层实现是什么?解决 Hash 冲突的方法有哪些?HashMap 是如何解决 Hash 冲突的?HashMap 的 put 方法流程?HashMap 扩容
当向 HashMap 中 put 元素时,会利用 key 的 hashCode 计算出当前元素在数组中的下标。然后将元素放入数组对应的下标位置中。在存储时,如果数组该位置已经有元素,则判断 key 是否相同。如果 key 相同,则覆盖 value。当从 HashMap 中获取元素时,直接去数组中找 key 的哈希值对应的下标。再进一步判断 key 是否相同,从而获取对应的值。HashMap 的底层实现是哈希表。在 jdk 1.8 之前是数组 + 链表,jdk 1.8 之后是数组 + 链表 + 红黑树。
2025-11-26 00:38:09
373
原创 代码随想录算法训练营第 47 天 | 739. 每日温度、496. 下一个更大元素 I、503. 下一个更大元素 II
单调栈的核心是放索引,而不是具体的值。(因为直到索引可以去数组中找对应的值;而知道值不能得到索引,且值可能重复。如果是求右边第一个大的:从栈顶到栈底递增如果是求右边第一个小的:从栈顶到栈底递减单调栈其实有正序遍历和倒序遍历,暂时只掌握正序遍历就可以了。单调栈模板while 循环要判断栈非空while 结束后不要忘记 pushi < n;stack.isEmpty() && nums[i] > nums[stack.peek()]) { // 必须判断栈非空。
2025-11-25 23:04:13
425
原创 八股训练营第 27 天 | Java的集合类有哪些,那些是线程安全的,那些是线程不安全的?ArrayList 和 Array 有什么区别、ArrayList 和 LinkedList 的区别是什么?
Java 的集合类由 Collections 和 Map 这两个接口派生而出,Collections 接口又派生出了 List、Set、Queue 这三个接口。Java 所有的集合类都是 List、Set、Queue、Map 这四个接口的实现类。线程不安全的集合有:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap 等。以上就是我对这个问题的理解。
2025-11-24 23:41:18
384
原创 代码随想录算法训练营第 46 天 | 647. 回文子串、516. 最长回文子序列
因为只需对矩阵右上三角便利,所以从左上到右下的对角线需初始化。:[i, j] 字符串的最长回文子序列长度。:[i, j](左闭右闭)的字符串是不是回文子串。遍历顺序:从下到上,从左到右(假设 j >= i)(因为根据递推公式,是从左下角往右上角推导的。初始化:全部初始化为 false。上题的子串:要求必须连续。前两种情况可以合并。子序列:可以不连续。从下到上,从左到右。
2025-11-24 20:59:01
159
原创 iTerm2 + Oh My Zsh + tmux 搭建好用终端
窗口左右分割:command + D上下分割:command + shift + D全屏切换:command + enter在最近使用的两个标签页之间切换:command + [ 和 command + ]切换到指定位置的屏幕:command + alt + 方向键文本编辑到行首:control + A到行尾:control + E清除当前行:control + U清屏:command + R(等于 control + L)上一条命令:ctrl + P。
2025-11-24 13:02:28
1675
原创 代码随想录算法训练营第 44 天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
评论区笔记评论区笔记2一般如果要是求的子数组是连续的,或者即使不是连续的,要求单调这种,都是需要定义 dp 是以 nums[i] 为结尾,最终结果是 max(dp)。因为如果不定义是以 nums[i] 为结尾,那么这时候即使做 nums[i] 的比较,也无法更新 dp[i],因为不知道 dp[i-1] 是不是以 nums[i-1] 结尾,如果不是,题目要求的数组的连续的,那就没法 dp[i] = dp[i-1]+1。
2025-11-22 23:58:17
805
原创 八股训练营第 24 天 | 说一说 Java 面向对象三大特性?说一说你对 Java 多态的理解?Java 重载和重写的区别?
重写的方法的访问级别要大于被重写的方法,返回类型和抛出异常的范围要小于被重写的方法。把一个子类对象直接赋值给父类引用变量,运行时调用引用变量的方法,其方法的行为总是表现出子类方法的行为特征,而不是父类方法的行为特征。即同一类型的变量在调用同一方法时,表现出不同的行为特征,这就是多态。运行时多态是在运行时根据对象实际的类型来确定调用的方法。编译时多态是在编译时就已经确定了调用的方法。这是由方法的重载实现的。总结一下,重载是运行一个类有多个同名方法,重写是允许子类提供特定于其父类的行为实现。
2025-11-22 00:51:08
164
原创 代码随想录算法训练营第 43 天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列
考虑 i - 1、j - 1 的最长公共子序列的长度。(注意:不一定选,和。两个指针 p1、p2。如果字符相等就都右移一位;如果不相等就 p2 右移一位。如果 p1 先到末尾,返回 true;如果 p2 先到末尾,返回 false。值得学习——循环条件与运算的利用(不需要判断字符串为空的特殊情况),再判断最长公共子序列长度等不等于 s 的长度。(基于 i -1、j - 1 不一定选的基础):以 i 结尾的最大数组和。两个方法本质上一致。
2025-11-21 23:28:26
363
原创 八股训练营第 23 天 | String、StringBuffer、StringBuilder的区别?接口和抽象类的区别?Java常见的异常类有哪些?
Error 通常是严重的错误,这类错误是程序无法处理的,如 OutOfMemoryError,表示内存不足;它又分为两大类:编译时异常(Checked Exception)和运行时异常(Runtime Exception)。运行时异常也叫非受检异常(Unchecked Exception),这类异常在运行时抛出,不要求捕获也无法编译时提前捕获。Java 编译器要求程序必须捕获或声明所有编译时异常,强制要求程序为可能出现的异常做准备工作。总而言之,接口更像是一组规范,强调所有实现它的类都必须要遵循它的规范;
2025-11-20 22:45:58
920
原创 代码随想录算法训练营第 42 天 | 300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
可以避免初始化时(dp[0][j]、dp[i][0]),初始第一行和第一列。一个小优化:把 result 更新放在 for 循环里面,使得代码更简洁。:以 i - 1、j - 1 为结尾的最长重复子数组。:以 nums[i] 结尾的最长连续子序列的长度。初始化:全赋为 1,因为最小长度就是 1。
2025-11-20 19:26:31
222
原创 八股训练营第 22 天 | 介绍一下Redis缓存雪崩、缓存穿透、缓存击穿,如何解决这些问题?如何保证数据库和缓存的一致性?
缓存雪崩:大量 Key 在同一时间失效,导致大量请求达到数据库上对数据库造成影响。给每个 Key 设置不同的随机的 ddl。不设置过期时间,改为定期更新缓存。缓存穿透:访问缓存和数据库都不存在的数据。常见于黑客构造不存在的 id 进行攻击。缓存空值:如果数据在缓存和数据库中都不存在,就在缓存中存入一个空值,下次直接返回这个空值。布隆过滤器:在 Redis 前面加一个布隆过滤器。对于不存在的数据会直接返回。缓存击穿:数据在缓存中不存在,在数据库中存在。
2025-11-20 00:23:46
216
原创 代码随想录算法训练营第 41 天 | 188. 买卖股票的最佳时机 IV、309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费
除了 0 之外,2 * k 个状态。奇数为持有(买入),偶数为不持有(卖出)。卖出时减去手续费即可。
2025-11-19 22:33:59
376
原创 八股训练营第 21 天 | Redis的数据类型有哪些?Redis是单线程的还是多线程的,为什么?说一说Redis持久化机制有哪些?
Redis 在接收客户端命令、解析命令、进行数据读写操作、发送数据给客户端这一过程是单线程的。但是 Redis 程序是多线程的。此外,在 Redis 6.0 之后,Redis 引入了多线程来处理网络 I/O 这部分,用于减少网络 I/O 阻塞带来的性能消耗。缺点是快照的频率不好把握,如果频率过低,数据可能丢失得比较多。Redis 的主要工作(网络 I/O 和执行命令)一直是单线程模型,6.0 之后,网络 I/O 引入了多线程。AOF 的优点是数据丢失得比较少,最多只有 1 秒的数据丢失;
2025-11-18 23:28:46
629
原创 代码随想录算法训练营第 40 天 | 121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II、123. 买卖股票的最佳时机 III
第 i 天持有股票的现金:前一天持有股票和当天买入的最大值。当天买入:前一天未持有股票的现金减当天买入的现金(因为可以买卖多次,前一天的初始现金未必是 0)第 i 天不持有股票的现金 = 前一天不持有和当天卖出的最大值。第 i 天持有股票的现金 = 前一天持有和当天买入的最大值。:第 i 天未持有(包括未买入和已经卖出)股票的收益。当天卖出:当天卖出的现金加上前一天未持有的负现金。:第 i 天第 1 次未持有股票。:第 i 天第 2 次未持有股票。:第 i 天第 1 次持有股票。:第 i 天未操作。
2025-11-18 21:44:21
381
原创 八股训练营第 20 天 | MySQL和Redis的区别是什么?Redis有什么优缺点、为什么用Redis查询会比较快?
总而言之,Redis 更适用于高并发的场景。在实际中两者通常结合使用。
2025-11-17 23:39:31
306
原创 代码随想录算法训练营第 39 天 | 198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III
注意到情况二包含情况一的情况;情况三也包含情况一的情况。所以只有 2 种情况,取最大值即可。dp[i]:考虑第 i 间屋子能获得的最大价值。(注意只是考虑,不代表就一定选。为了解决首尾不能同时取的情况,将原情况分为 3 个子情况。每个节点有一个二维数组 dp。树形 dp + 后序遍历。
2025-11-17 22:37:52
266
原创 八股训练营第 18 天 | 什么是慢查询、原因是什么、可以怎么优化?undo log、redo log、binlog 有什么用?
慢查询是指查询时间超过指定时间的语句。查询语句比较复杂,包含复杂的表连接和子查询。查询的数据量比较庞大。缺少索引。或者没有走索引走的是全表扫描。数据库设计不合理。数据库表比较大。并发资源冲突。多个并发进程访问相同资源导致冲突等待。开启慢查询日志,定位比较慢的 sql 语句。通过 explain 执行计划分析 sql 语句有没有有没有使用索引和连接的表。从而优化sql 语句。查询区分度较高的字段。
2025-11-17 00:17:47
290
原创 代码随想录算法训练营第 37 天 | 322. 零钱兑换、279. 完全平方数、139. 单词拆分、多重背包
dict = {“apple”, “pen”},apple为 1,pen 为 2。这样就 for 循环中就不需要 if 判断了。小优化:为 true 后直接 break。初始化:dp[0] = 0,其他为。必须是排列顺序 121,不能是112。因为递推公式取的是 min。是排列问题,不是组合问题!先遍历背包,再遍历物品。
2025-11-16 20:14:54
605
原创 八股训练营第 17 天 | MySQL的执行引擎有哪些?MySQL为什么使用B+树来作索引?说一下索引失效的场景?
MySQL 的执行引擎用于查询的执行和数据的存储,常见的 MySQL 存储引擎包括 InnoDB、MyISAM、Memory。索引失效指的是查询操作不能利用索引,可能进行全表查询,从而导致查询性能下降。B+ 树是 B 树的变种,提供了更好的数据检索、插入和删除、范围查询性能。
2025-11-16 13:30:03
455
原创 代码随想录算法训练营第 36 天 | 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、爬楼梯(进阶版)
这个区别也导致了 01 背包和完全背包。初始化时比较巧妙的是将。,同时也运用递推公式。
2025-11-14 23:42:46
410
原创 八股训练营第 16 天 | 一条SQL查询语句是如何执行的?事务的四大特性有哪些?数据库的事务隔离级别有哪些?
事务是一组不可分割的操作集合,要么全部成功,要么全部失败回滚。
2025-11-13 22:17:08
337
原创 代码随想录算法训练营第 35 天 | 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
题目链接类似于416. 分割等和子集,尽量分出两堆重量相近的石头。sum += x;i < n;i++) {j--) {01 背包1.1 二维数组dp[i][j]0~i的物品任意放入容量为j的背包,最大的价值。初始化:第一列dp[i][0]初始化为 0,第一行dp[0][j]从第一个满足 0 号物品的地方开始初始化为不为 0。(按需初始化)遍历顺序:遍历顺序可以颠倒。for循环中,i从1开始遍历;j从0或1皆可。1.2 一维数组dp[j]:容量为j的背包的最大价值。
2025-11-13 17:05:38
669
原创 八股训练营第 15 天 | 熟悉哪些Linux命令?Linux中如何查看一个进程,如何杀死一个进程,如何查看某个端口有没有被占用?说一下 select、poll、epoll?
I/O 多路复用通常通过 select、poll、epoll 等系统调用机制实现。查看特定端口有没有被进程占用。查看所有绑定在某端口号的服务及其。查看所有进程及其详细信息。命令查看进程,如使用。(进程 ID),然后用。
2025-11-12 23:59:10
382
原创 代码随想录算法训练营第 34 天 | 01 背包理论基础 - 二维数组、01 背包理论基础 - 一维数组、416. 分割等和子集
对于 01 背包二维 dp 数组的实现,其遍历顺序可以颠倒。
2025-11-12 23:16:31
460
原创 代码随想录算法训练营第 33 天 | 62. 不同路径、63. 不同路径 II、343. 整数拆分、96. 不同的二叉搜索树
状态压缩,一维数组:新 = 旧(新上)+ 旧左。dp[i] 表示 i 的最大乘积。优化:for 循环中,
2025-11-12 00:19:54
390
原创 八股训练营第 13 天 | 什么是死锁,如何避免死锁?介绍一下几种典型的锁?讲一讲你理解的虚拟内存?
死锁是一组互相竞争资源的线程因为互相等待对方释放资源而陷入永久阻塞的过程。互斥条件:如果一个线程占有了某个资源,那么其他线程不能再占有这个资源。请求保持条件:一个线程当申请某个资源陷入等待时,不会释放自己拥有的资源。不可剥夺条件:资源不能强行从某个线程中被剥夺,只能由持有者资源释放。循环等待条件:不同线程形成了一个循环等待资源的链。每一个线程都在等待下一个线程释放资源。如何避免死锁:只要破坏 4 个必要条件之一即可。互斥条件不能被破坏。因为锁本身就是通过互斥解决线程安全问题的。
2025-11-10 23:02:24
577
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅