- 博客(38)
- 收藏
- 关注

原创 小白从零开始学习Java(后端开发路线)
SSM框架我是学习的黑马的,也就是第一个链接,黑马讲解的SSM整体上还是比较容易理解的,当然刚开始不懂很正常多看两遍就懂了 ,黑马的SSM课程单独讲了Spring、SpringMvc以及Mybatis-Plus(没学过mybatis的可以去学一下尚硅谷10小时的mybatis课程),然后又进行了整合讲解,顺带讲了一下SpringBoot(只要学会SSM,很简单)。黑马的SSM还是很推荐的,其次就是尚硅谷的,虽然没学过,但以尚硅谷的口碑,特别适合时间充足的人学习,也比较细致。
2025-04-09 11:49:13
926
原创 Maven安装配置以及Idea中的配置教程
我使用的是3.9.9的版本:下载地址:Download Apache Maven – Maven将下载好的Maven压缩包解压到一个路径不包含中文的文件夹:以win11系统为例:1.鼠标右键此电脑->属性->高级系统设置点击环境变量找到系统变量一栏,点新建 2.新建系统变量MAVEN_HOME 变量值就是刚才解压缩后的地址3.编辑系统变量Path,添加变量值%MAVEN_HOME%\bin4.验证安装是否成功,win+R运行cmd,输入mvn -v,如图所示则配置成功 配置settings文件主要有两点:1
2025-05-03 22:07:05
737
原创 为什么你的大模型总‘胡言乱语’?RAG技术让它学会‘查资料’!
就是通过多次训练提问增加AI的专业知识储备,AI在回答问题时,通过训练所得的知识储备进行回答,缺点是对于 一些实时性较强的信息AI无法给出准确的答案,维护成本高需要经常训练。
2025-05-02 21:24:09
903
原创 快速上手非关系型数据库-MongoDB
MongoDB 是一个基于文档的数据库,由 MongoDB Inc. 开发。NoSQL,指的是非关系型的数据库。NoSQL有时也称作的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求。MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。:存储数据的容器,类似于关系型数据库中的数据库。:数据库中的一个集合,类似于关系型数据库中的表。
2025-05-01 18:27:47
1698
原创 Spring MVC异常处理利器:深入理解HandlerExceptionResolver
在 Web 开发中,异常处理是保障系统健壮性和用户体验的关键环节。Spring MVC 提供了多种异常处理机制,其中是一个强大且灵活的底层工具。本文将深入探讨它的工作原理、使用场景、实战技巧,并通过具体代码示例展示如何全局统一处理异常。是 Spring MVC 中用于的接口。它允许开发者将异常转换为特定的 HTTP 响应,例如:跳转到自定义错误页面(HTML)返回结构化的错误 JSON(API 接口)设置 HTTP 状态码(如 404、500)
2025-04-28 18:11:22
853
原创 【LeetCode Hot100 | 每日刷题】盛最多水的容器
时间复杂度:O(n),双指针最多遍历整个数组一次。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。
2025-04-25 14:50:30
313
原创 【LeetCode Hot100 | 每日刷题】三数之和
不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。本题的难点在于怎么去除重复解。唯一可能的三元组和为 0。,判断是否存在三元组。时间复杂度:O(n^2)
2025-04-25 11:44:36
549
原创 【MySQL面渣逆袭 | 第一篇】MySQL的存储引擎和日志
错误⽇志(error log):错误⽇志⽂件对 MySQL 的启动、运⾏、关闭过程进⾏了记录,能帮助 定位 MySQL 问题。慢查询⽇志(slow query log):慢查询⽇志是⽤来记录执⾏时间超过 long_query_time 这个变 量定义的时长的查询语句。通过慢查询⽇志,可以查找出哪些查询语句的执⾏效率很低,以便进⾏ 优化。⼀般查询⽇志(general log):⼀般查询⽇志记录了所有对 MySQL 数据库请求的信息,⽆论请 求是否正确执⾏。⼆进制⽇志(bin log)
2025-04-22 15:23:54
1331
原创 MYDB仿MySQL手写数据库项目总结
因为有两阶段锁协议(2PL),当一个事务对一个资源上锁之后,其他事务只能阻塞等待,而这样有死锁的可能,在项目中,我们把事务Ti等待事务Tj解锁抽象为一条有向边,即Ti->Tj,这样多条有向边就组成图,我们通过检查这个图是否是循环的,就可以来检查是否有死锁。SQL解析是通过里面一个分割相关的类把SQL语句分割成不同的部分,比如关键字、字母下划线、字符串等等,然后通过praser解析类先来判断第一个部分的关键字,比如select、insert等等,然后把同一类的SQL交给不同的方法解析。对每个持有资源的事务(
2025-04-21 18:06:09
1032
原创 【计算机网络 | 第三篇】常见的网络协议(二)
IP 地址过滤(IP Address Filtering)简单来说就是限制或阻止特定 IP 地址或 IP 地址范围的访问。例如,你有一个图片服务突然被某一个 IP 地址攻击,那我们就可以禁止这个 IP 地址访问图片服务。IP 地址过滤是一种简单的网络安全措施,实际应用中一般会结合其他网络安全措施,如认证、授权、加密等一起使用。单独使用 IP 地址过滤并不能完全保证网络的安全。MAC 地址的全称是媒体访问控制地址(Media Access Control Address)。
2025-04-20 11:33:50
900
原创 【计算机网络 | 第二篇】常见的通信协议(一)
HTTP默认是80端口,HTTPS默认是443。:HTTPHTTP 的 URL 前缀是http://,HTTPS 的 URL 前缀是https://。:HTTP协议运行在TCP上,都是明文传输,客户端和服务端都无法验证对方的身份。HTTPS协议是运行在SSL/TLS上的HTTP协议,SSL/TLS运行在TCP上,所有传输内容都经过加密,加密采用对称加密,但是对称加密的密钥用服务器方的证书采用非对称加密。所以HTTP协议没有HTTPS协议安全,但是HTTPS协议比HTTP协议耗费更多资源。
2025-04-19 12:09:19
1143
原创 【计算机网络 | 第一篇】计算机网络基础知识
URL(Uniform Resource Locators),即统一资源定位器。网络上的所有资源都靠 URL 来定位,每一个文件就对应着一个 URL,就像是路径地址。理论上,文件资源和 URL 一一对应。实际上也有例外,比如某些 URL 指向的文件已经被重定位到另一个位置,这样就有多个 URL 指向同一个文件。
2025-04-18 11:15:45
1475
原创 【从零开始学习JVM | 第五篇】认识常见的垃圾收集器
Serial(串行)收集器是最基本、历史最悠久的垃圾收集器了。大家看名字就知道这个收集器是一个单线程收集器了。它的的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程(),直到它收集结束。虚拟机的设计者们当然知道 Stop The World 带来的不良用户体验,所以在后续的垃圾收集器设计中停顿时间在不断缩短(仍然还有停顿,寻找最优秀的垃圾收集器的过程仍然在继续)。但是 Serial 收集器有没有优于其他垃圾收集器的地方呢?
2025-04-18 09:41:09
918
原创 【从零开始学习JVM | 第三篇】虚拟机的垃圾回收学习(一)
无论是通过引用计数法判断对象引用数量,还是通过可达性分析法判断对象的引用链是否可达,判定对象的存活都与“引用”有关。JDK1.2 之前,Java 中引用的定义很传统:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种(引用强度逐渐减弱),强引用就是 Java 中普通的对象,而软引用、弱引用、虚引用在 JDK 中定义的类分别是。
2025-04-12 16:00:58
820
原创 数据库守护神-WAL机制
WAL(Write-Ahead Logging,预写日志)是一种保证数据库操作和的核心机制。:日志的写入必须早于数据修改的完成。:所有修改操作都能通过日志完整重建。:系统崩溃后,通过日志可恢复到一致状态。
2025-04-11 17:55:23
561
原创 【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘
虚拟机遇到一条new的指令,首先去检查这个指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行类的加载过程。在通过后,接下来虚拟机将为新生对象,对象所需内存在类加载之后便可确定,为对象分配空间的任务等于说从把一块确定大小的内存从Java堆中划分出来。分配方式有和两种方式,适用场景:堆内存规整的情况下(没有内存碎片)。
2025-04-11 11:09:20
939
原创 【从零开始学习JVM | 第一篇】快速认识JVM
JVM--Java虚拟机,它是Java实现平台无关性的基石。Java程序运行的时候,编译器将Java代码编译为平台无关的Java字节码文件(.class),接下来对应平台的JVM对字节码进行运行解释,翻译成对应平台匹配的机器指令进行运行。同时JVM也是一个跨语言的平台,和语言无关,只和class的文件格式关联,任何语言,只要能翻译成符合规范的字节码文件,都可以被JVM运行。
2025-04-09 10:42:55
900
原创 【并发编程 | 第七篇】深入学习线程池(一)
线程池是用来管理和复用线程的⼯具,它可以减少线程的创建和销毁开销。在 Java 中,ThreadPoolExecutor 是线程池的核⼼实现,它通过核⼼线程数、最⼤线程数、任务队列和拒绝策略来 控制线程的创建和执⾏。举个栗子:就像你开了⼀家餐厅,线程池就相当于固定数量的服务员,顾客(任务)来了就安排空闲的服务员(线 程)处理,避免了频繁招⼈和解雇的成本。
2025-04-06 23:06:45
898
原创 【并发编程 | 第六篇】深入学习synchronized关键字
是 Java 中的一个关键字,翻译成中文是同步的意思,主要解决的是多个线程之间访问资源的同步性,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。在 Java 早期版本中,属于,效率低下。这是因为监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高。
2025-04-05 17:09:14
1122
原创 【并发编程 | 第五篇】探索ThreadLocal的原理
是 Java 提供的一个线程本地变量工具类,用于在多线程环境下为每个线程提供独立的变量副本。简单来说,它能让每个线程拥有自己的“储物柜”,存储仅对自己可见的数据,,同时减少同步锁的开销。当你创建一个变量时,每个访问该变量的线程都会拥有一个独立的副本。这也是名称的由来。线程可以通过get()方法获取自己线程的本地副本,或通过set()方法修改该副本的值,从而避免了线程安全问题。
2025-04-04 16:19:09
1547
原创 【并发编程 | 第四篇】悲观锁与乐观锁的学习
包含悲观锁与乐观锁的定义,像synchronized、ReentrantLock等都是常见的悲观锁,而乐观锁其实并没有锁,是通过版本号机制和CAS技术等方法实现的,同时还介绍了CAS的原理、如何实现的原子操作以及CAS存在的问题。
2025-04-03 12:27:37
1435
原创 【并发编程 | 第三篇】Java内存模型JMM的详解
CPU缓存是位于CPU和主内存(RAM)之间的高速存储器,用于减少CPU访问数据的延迟。由于CPU速度远快于内存,缓存通过存储频繁访问的数据副本,避免CPU因等待内存响应而闲置。为什么要弄一个 CPU 高速缓存呢?类比我们开发网站后台系统使用的缓存(比如 Redis)是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。CPU 缓存则是为了解决 CPU 处理速度和内存处理速度不对等的问题。我们甚至可以把内存看作外存的高速缓存。
2025-03-31 14:02:30
723
原创 【并发编程 | 第二篇】如何理解多线程以及死锁
线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。下面通过一个例子来说明线程死锁,代码模拟了上图的死锁的情况 (代码来源于《并发编程之美》)://资源 1//资源 2try {}, "线程 1").start();try {
2025-03-28 17:52:34
708
原创 【并发编程 | 第一篇】线程相关基础知识
并发是指多核CPU上的多任务处理,多个任务在同一时刻真正同时执行。并行是指单核CPU上的多任务处理,多个任务在同一时间段内交替执行,通过时间片轮转实现交替执行,用于解决IO密集型瓶颈。如何理解线程安全呢?如果一段代码块或者一个方法被多个线程同时并发执行,其中的共享内容还能够有序正确的执行,就说明是线程安全的。一个操作如果执行要么成功,要么失败,不会只执行一部分。可以通过同步关键字 synchronized 或原⼦操作,如 AtomicInteger 来保证原子性。
2025-03-27 18:41:57
1488
1
原创 一次性解释清楚redis缓存三大问题
通常面试或者学习redis涉及到的redis缓存三大问题为缓存击穿、缓存穿透以及缓存雪崩。下面就逐一讲解什么是缓存击、穿透以及雪崩,附上它们常见的解决方法。
2025-03-26 13:37:37
1540
原创 数据库日志(binlog、redo log、undo log)
又称归档日志,由binlog是一种记录对表数据进行增删改操作以及表结构改变的二进制文件。update、delete、insert、create table等等语句都会被记录,binlog记录的是sql语句,属于逻辑日志。并且binlog是追击写入的,即写满一个文件后,会再创建一个文件接着写入,文件名称是mysql-bin.xxxxxx,如mysql-bin.000001,序号递增。
2025-03-20 17:28:59
588
原创 MySQL的锁机制(复习笔记)
MySQL中的锁按照锁的粒度来分,以下三种:全局锁:锁定数据库的全部表表级锁:每次操作锁定整张表行级锁:每次操作锁定表中的一条数据。
2025-03-19 21:55:44
554
原创 HashMap的扩容机制以及jdk1.8之后的优化
为了减少哈希冲突发⽣的概率,当当前HashMap的元素个数达到⼀个临界值的时候,就会触发扩容, 把所有元素rehash之后再放在扩容后的容器中,这是⼀个相当耗时的操作。⽽这个 临界值threshold 就是由加载因⼦和当前容器的容量大小来确定的,假如采⽤默认的构造⽅法:临界值(threshold )= 默认容量(DEFAULT_INITIAL_CAPACITY) * 默认扩容因⼦ (DEFAULT_LOAD_FACTOR)为什么选择0.75为扩容因子呢?
2025-03-12 20:16:12
1085
原创 如何在项目中整合Knife4j实现API文档生成和RESTful Web测试?
这样配置后,当Spring Boot应用运行时,它会自动处理这些静态资源的请求,并从相应的目录中提供资源。可以看到该接口是POST类型的,是RESTful风格,同时还有该接口的访问路径以及请求参数和示例等等。knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案。Knife4j 完全遵循了 Swagger 的使用方式,所以可以无缝切换。支持动态参数,允许用户在运行时修改API请求的参数,测试更加灵活。你可以任意修改请求参数,通过点击发送来测试接口,测试十分灵活。
2025-03-09 15:41:52
750
原创 HashMap的哈希/扰动函数底层原理
以 String 类为例,它根据字符串的字符序列计算哈希值,保证相同内容的字符串哈希值相同,不同内容的字符串哈希值尽量不同。得到的初始哈希值是⼀个32位的int类型的数值,然后让hashcode的⾼ 16位和低16位进⾏异或操作,使得哈希值的高位和低位都参与运算,进一步打乱哈希值,使其分布更均匀。使不同的键能均匀地分布在哈希表中,减少哈希冲突,即尽量让不同的键计算出的哈希值分散在哈希表的不同位置,提高存储和查找效率。能够快速地计算出键的哈希值,以保证HashMap的插入、查找和删除等操作具有较好的性能。
2025-03-07 15:23:19
282
原创 JWT的使用原理及执行流程
JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用间安全传输信息,通常用于身份验证和信息交换。其核心特点是通过紧凑且自包含的 JSON 对象传递数据,无需服务端存储会话状态。
2025-03-04 10:48:20
1174
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人