- 博客(50)
- 收藏
- 关注
原创 BFS解决单源最短路问题
外层循环(遍历这个单词的每一位),内层循环(遍历26个字母),如果找到的单词在have当中,并且不在visit当中,就判断是否和end一样,如果一样就返回step+1,不一样就把它加入到queue和visit当中。接下来只要队列非空就进行操作,首先算出该队列的长度(记作m),然后循环m-1次,每次都取出队首元素,开始遍历它的四个方向,如果合法(不越界,未被访问,并且在forest数组中非0)并且是终点位置,就返回step+1,否则就把该位置加入到队列当中,并在vis数组中把该位置设为true。
2025-12-26 17:59:56
973
原创 BFS解决FloodFill相关问题
广度优先搜索(简称BFS)是一种遍历或搜索树和图的算法,也称为宽度优先搜索,BFS算法从图的某个节点开始,依次对其所有相邻节点进行探索和遍历,然后再对这些相邻节点的相邻节点进行探索,直到遍历完所有的节点。该算法使用队列来辅助实现,将起始节点放入队列中,然后依次取出队列中的节点,访问其相邻节点,并将其加入队列,像这样一直执行入队和出队操作直至队列为空,这样可以保证从起始节点出发,依次按照距离顺序遍历节点。
2025-12-21 19:21:33
921
原创 MyBatis XML的方式来实现
使用这种方式的时候我们需要在配置文件中配置 mybatis xml 的文件路径:这里需要注意的是:resources文件夹之下的这个mapper文件夹的名字要和配置文件中classpath后端mapper的名字要保持一致。同时以上述的配置信息为例,mapper文件夹之下的xml文件一定是要以Mapper为结尾。
2025-12-17 20:44:44
396
1
原创 MyBatis:注解方式实现数据库 CRUD 全操作
Mybatis 是一个轻量级的 Java 持久层框架,它简化了数据库操作,将 SQL 语句与 Java 代码解耦。通过 XML 或注解配置 SQL 映射,开发者可以更灵活地操作数据库,同时避免了传统 JDBC 的繁琐编码。Mybatis 支持动态 SQL、存储过程以及高级映射功能,是 Java 应用中常用的 ORM 解决方案之一。
2025-12-17 17:15:08
826
原创 优先级队列(堆)相关题目的讲解
优先级队列常用来解决TOPk问题以及第K大或者第K小问题。我们首先来讲一下解决 TOP K 大元素 / 第 K 大元素要选小根堆。
2025-12-14 19:20:39
892
原创 深入剖析依赖注入(DI)
至此,我们已经讲解了依赖注入的三种核心实现方法以及多实例场景下的解决方案。总结来说,属性注入适合简单场景下的快速使用;而当存在多个同一类型Bean时,可根据实际需求选择@Primary、@Qualifier或@Resource注解来解决冲突。
2025-12-10 20:02:00
920
原创 深入解析Spring IoC核心与关键注解
本文我们梳理了Spring IoC的核心思想,了解了其通过反转控制将对象创建与管理交给Spring容器的逻辑,也通过具体代码示例掌握了Bean的获取方式。同时,剖析了五大注解(@Controller、@Service、@Repository、@Configuration、@Component)的用法、分层场景差异,以及@Bean注解的使用规则,也明确了各类注解BeanName的默认规则与修改方式。
2025-12-07 16:38:31
622
原创 二叉树的层序遍历:4道例题讲解
429. N 叉树的层序遍历 - 力扣(LeetCode)先来看这道题:因为层序遍历的本质是按 “层” 的顺序处理节点:先处理第 1 层(根节点),再处理第 2 层(根的所有子节点),接着处理第 3 层(第 2 层每个节点的子节点)……而队列的特性是 “先进先出”,刚好能匹配这种 “按顺序处理、按顺序传递下一层节点” 的逻辑:由于队列本身是 “连续的节点”。那么我们在处理的过程中很可能出现下面这种情况:当前层节点还没处理完时,下一层节点已经在往队列里加了。如果我们不记录 “当前层有多少个节点”,那么
2025-12-06 18:15:59
966
原创 Linux 核心基础实操(含远程登录、编辑器、用户管理等)
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员先申请一个账号,然后以这个账号的身份进入系统。之前我们在创建用户的时候,没有指定组,其实系统会自动给用户分配一个组,这个组的名称和用户的名称是一样的。如果我们使用自己创建的用户登录,默认的情况下,用户所在的目录就是/home/完成后系统会自动重启,新。用户之下,我们可以创建很多其它的用户,并且这些用户都会生成对应的目录,这些目录位。注意:在切换用户的时候,如果从低级别的用户切换到高级别的用户,需要输入密码的。
2025-12-01 20:34:02
674
原创 Spring MVC 响应处理详解
在 Web 开发中,后端与前端的交互离不开响应的处理,Spring MVC 提供了灵活的响应机制,可根据需求返回页面、数据、HTML 片段或 JSON 等。下面结合具体代码,详细讲解相关注解及响应方式。
2025-11-19 19:21:48
511
原创 Cookie和Session的代码实现
通过本文的代码示例,我们学习了 Cookie 和 Session 的具体应用。Cookie 主要用于在客户端存储少量数据,而 Session 则用于在服务器端存储用户会话信息。
2025-11-16 16:39:38
1055
原创 Java Web核心数据交互技术全解析
本文介绍了JSON与Java对象的转换、请求参数传递、文件上传,以及Cookie与Session的状态保持机制,结合代码示例与场景类比。在实际开发中,需根据业务场景选择合适的参数传递方式与状态保持方案,同时注意Session的持久化与Cookie的安全性,确保应用的高效与可靠。
2025-11-14 10:25:25
929
原创 Spring MVC 中 @RequestMapping 路径映射与请求处理全流程
是实现 URL 路径与控制器方法映射的核心注解。以上述代码为例,通过这个路径映射我们可以找到UserController这个类,以及该类中的m1方法。可标注在类和方法上,两者的路径会自动拼接形成类上的定义了方法上的定义了最终完整访问路径为:类路径+方法路径这个路径有方法路径和类路径,通常我们会在这两个地方都进行声明。这是为了提高可读性。需要注意的是当资源路径=方法路径+类路径。
2025-11-11 20:59:47
441
原创 JVM中的内存管理
核心区域有4个:这是一个很小的区域,用来记录当前的指令执行到哪个地址了。这个区域用来保存当前类被加载好的数据。Java源文件(.java)经过编译后会生成字节码文件(.class),这些二进制文件需要通过类加载机制被载入内存才能执行。栈里面保存的是方法的调用关系。我们在写代码的时候,肯定会涉及到方法的调用。当我们每次调用方法的时候,会先进入方法内部执行代码,执行完之后需要回到调用方法处继续往下执行代码。假设我们的代码中现在有main方法和test1方法,那么这个栈中就会保存这样两个元素,像这样的元素
2025-11-02 12:55:03
789
原创 以太网帧、DNS 与 hosts 文件
从以太网帧中 MAC 地址的分段转发,到 DNS 将域名转化为 IP 的便捷解析,再到 hosts 文件与缓存、镜像服务器的优化补充,每一个环节都在解决网络通信中的实际问题。这些底层设计既保证了数据传输的准确性,又提升了访问效率,是我们顺畅使用网络的重要保障。
2025-10-31 10:51:12
423
原创 TCP核心机制
我们前文所讲的确认应答策略, 对每⼀个发送的数据段, 都要给⼀个ACK确认应答. 收到ACK后再发送下⼀个数据段。这样做有⼀个⽐较⼤的缺点, 就是性能较差. 尤其是数据往返的时间较⻓的时候.。既然这样⼀发⼀收的⽅式性能较低, 那么我们⼀次发送多条数据, 就可以⼤⼤的提⾼性能(其实是将多个段的等待时间重叠在⼀起了)。
2025-10-25 16:28:04
957
1
原创 常见的位运算的总结
左移:<< :每左移 1 位右侧补 1 个 0,移出去的数字舍去。。(负数则在最左侧补1)按位取反:~按位与:&(有0则0)按位或:|(有1则1)按位异或:^(
2025-10-19 17:31:59
422
原创 HTTP协议
这主要是在登陆场景中有所体现,当我们使用GET方法的时候,我们的用户名和密码就会放到url的Query String中,于是它们就会显示在浏览器的地址栏上。最后面的一部分是查询字符串(Query String),这是对要访问的资源的一个补充说明,它也是键值对结构,键值对之间用&分割,键和值之间用=分割。在那个时候要是传输的数据很多,是有可能被截断的。接下来的一部分内容是正文(body),需要注意的是有些请求中有正文,而有些请求中是没有正文的。当我们获取html,css,js的时候,都是GET方法。
2025-10-11 20:08:23
813
原创 深入应用层协议定制:从确定通信内容到选择数据组织方式的完整攻略
通过点外卖这一贴近生活的场景,我们清晰地看到了应用层协议定制的全流程:先基于业务需求精准梳理出客户端与服务器间需传递的关键信息,再从行文本、XML、JSON 到 Protobuf 等多种格式中,根据可读性、带宽消耗等需求选择合适的数据组织方式。行文本格式虽 “原始” 却简单直接,曾在早期网络通信中广泛应用;XML 格式可读性强但冗余信息多,带宽成本较高;JSON 格式兼顾可读性与轻量化,成为当下主流选择;而 Protobuf 以二进制存储实现极致压缩,最大程度降低带宽消耗,却失去了部分可读性。
2025-10-10 20:06:27
518
原创 传输层协议与 Socket API 网络编程
传输层为应用层提供数据传输服务,其核心是通过操作系统提供的 Socket API 实现。传输层有两个核心协议 ——TCP 和 UDP,由于两者特性差异较大,Socket API 也为它们提供了两套不同的实现方式。传输层主要有两个核心的协议,分别是TCP和UDP这两个协议的差别比较大,所以在进行编写代码的时候也是不同的风格。为了让这两个协议都能够使用,因此socketapi提供了两套。
2025-09-28 19:00:03
575
原创 网络协议基础:五元组与协议分层
进行一次网络通信,就会涉及到5个非常关键的信息,这五个关键信息又叫做“五元组”它们分别是:源IP源端口目的IP目的端口协议类型我们以“贫僧自东土大唐而来,到西方拜佛求经”这句话为例在这句话中,贫僧就是“源端口”;东土大唐就是“源IP”;西方就是“目的IP”;而“拜佛求经”就是“目的端口”
2025-09-26 20:43:39
1131
原创 Java.util.concurrent 核心组件解析
Java.util.concurrent包是 Java 多线程开发的核心工具集,本文介绍的CallableReenntrant、Semaphore、CountDownLatch 及并发集合,覆盖了多线程任务定义、锁控制、资源协调、任务等待与安全容器等核心场景。
2025-09-22 15:41:32
574
原创 常见的锁策略
这两种锁不是针对某一种具体的锁,而是某个锁具有“悲观”的特性,或者具有“乐观”的特性。悲观锁:在加锁的时候,预测接下来的锁竞争会很激烈,需要针对这样的情况做一些额外的处理。乐观锁:在加锁的时候,预测接下来的锁竞争不会很激烈,所以就不需要针对这样的情况做一些额外的处理。
2025-09-20 15:32:05
534
原创 Java---线程池讲解
提前备好 线程,要用的时候直接拿,不用再重新创建,用完也不立马销毁,而是放回池里下次再用。这样既避免了频繁创建 / 销毁线程的高开销,又能高效处理大量任务。
2025-09-15 20:14:01
685
原创 Java 阻塞队列:从原理到生产者消费者模型实践
线程安全(无需手动处理同步)与阻塞特性(空则等、满则停),并以 “包饺子” 案例引出生产者消费者模型。
2025-09-13 09:54:42
426
原创 详解单例模式:饿汉、懒汉与线程安全优化
单例模式的核心是确保类在程序中仅存一个实例,关键围绕 “创建时机” 与 “线程安全” 展开:饿汉模式在类加载时提前创建实例,简单且天然线程安全,但可能浪费资源;懒汉模式首次调用时延迟创建,需通过 “双重检查锁+ volatile” 解决线程安全与指令重排序问题,避免资源浪费但实现稍复杂。
2025-09-09 19:55:02
709
原创 Java 中 wait 与 notify 的详解:线程协作的关键机制
wait 与 notify 是 Java 中实现线程间协作的重要机制,它们与锁紧密配合,能够有效解决线程竞争导致的问题(如线程饿死)。正确理解和使用这两个方法,对于编写高效、可靠的多线程程序至关重要。使用时需特别注意锁对象的一致性和 wait/notify 的调用顺序,以避免程序出现难以调试的并发问题。
2025-09-08 14:10:00
811
原创 深入解析 Java 内存可见性问题:从现象到 volatile 解决方案
用 volatile 关键字修饰变量。在实际开发中,当多个线程涉及同一变量的读写操作时,及时使用 volatile,能有效避免因内存可见性引发的线程安全隐患。
2025-09-07 14:46:14
1048
原创 Java 并发编程解析:死锁成因、可重入锁与解决方案
当多个线程(N个)需要按顺序获取多把锁(M把),如果线程间出现循环等待锁的情况(你等我的锁,我等他的锁,最后又绕回来等你的锁),就会触发死锁。哲学家就餐问题是 “N个线程 + M把锁” 引发死锁的经典案例。死锁是并发编程中的 “隐形陷阱”,但并非无法预防。核心在于理解它的四个必要条件,并通过 “避免嵌套加锁”“约定加锁顺序” 等方式破坏这些条件。
2025-09-04 18:52:40
623
原创 线程安全问题及解决方案
线程安全问题是多线程编程中常见的挑战,其根源在于操作系统的抢占式调度机制以及非原子操作对共享资源的并发修改。通过synchronized关键字,我们可以对关键代码块或方法进行加锁,确保其原子性执行,从而有效解决线程安全问题。在实际开发中,合理使用synchronized需要注意两点:一是代码块的范围要恰当,二是锁对象的选择要正确。只有这样,才能在保证线程安全的同时,尽可能减少对程序性能的影响。
2025-09-02 20:35:25
932
4
原创 Java 线程的状态、终止与协作全解析
本篇文章主要讲 Java 中线程相关的知识。我会先说说前台线程和后台线程的区别,前台线程会影响整个程序的结束,必须都跑完程序才算结束;后台线程则不影响,主程序结束了它也跟着结束。我们自己创建的线程,包括 main 主线程,默认都是前台的,不过可以用 setDaemon 改成后台的。另外,还会讲到线程的生命周期,Thread 对象和系统线程不是一回事,可能对象还在,线程已经没了。还有线程怎么终止,比如用标志位,或者 interrupt 方法;
2025-08-21 17:27:48
785
原创 线程的概念、特点与创建方式
线程作为进程里的 “轻量级工人”,靠着共享资源、创建销毁成本低的特点,让程序能更高效地 “同时” 处理多个任务。不过要注意的是 ——线程太多也会拖慢速度,一个线程出异常还可能影响整个进程,这些都是我们在使用多线程时要注意的。另外,从创建线程的两种方式,我们便能看出编程里 “解耦合、高内聚” 的设计智慧,这可以让我们的代码更灵活、易维护。多线程就像一把双刃剑,用好了可以提升效率,但我们在使用的过程中也得小心线程安全、调度开销这些 暗坑”。
2025-08-17 15:08:45
1224
原创 探秘计算机:从硬件构成到进程运转的核心逻辑
从硬件的组装到指令的二进制流转,从进程的状态切换到资源的智能分配,计算机的每一个细节都体现了 “分工协作” 的智慧。CPU 作为核心处理器,存储器负责数据流转,操作系统则像 “交通指挥官”,让进程可以有序运行。理解这些底层逻辑,不仅能帮助我们更好地使用计算机,更能窥探到信息时代的技术基石 —— 正是这些看似复杂的机制,共同支撑起了数字世界的高效运转。
2025-08-16 10:06:32
951
原创 数据库事务深度解析:从 ACID 到隔离级别的实践逻辑
事务作为数据库保证数据可靠性的核心机制,其 ACID 特性是数据一致性的 “四大支柱”—— 原子性确保操作无中间态,一致性守护数据规则不被破坏,隔离性化解并发冲突,持久性保障结果稳定落地。而隔离级别的选择,则体现了在并发性能与数据安全之间的平衡智慧:从读未提交到串行化,每一级别都有其适用场景。理解事务的运行逻辑,不仅能帮助我们在开发中规避数据不一致的 “坑”,更能让我们在设计系统时,根据业务需求灵活选择合适的隔离策略,在保证数据安全的同时兼顾系统性能。
2025-08-11 14:37:45
808
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅