- 博客(40)
- 收藏
- 关注
原创 数据结构---------红黑树
红黑树是一种自平衡二叉查找树,通过变色和旋转操作保持平衡,确保操作时间复杂度为O(logn)。相比AVL树,红黑树在频繁插入删除时效率更高。其特性包括:根节点为黑色、无连续红节点、路径黑节点数相同等。插入新节点时,默认设为红色,通过变色和旋转(左旋/右旋)调整平衡。红黑树通过动态调整机制,在保证效率的同时避免了极端情况下的性能退化,是高效数据结构的理想选择。
2025-10-23 14:37:40
1111
原创 布隆过滤器
本文介绍了布隆过滤器这一高效的数据结构。布隆过滤器由位数组和多个哈希函数组成,占用空间小、查询效率高,但存在概率性误判和难以删除元素的缺点。其工作原理是通过哈希函数将元素映射到位数组中的多个位置,查询时检查这些位置是否均为1来判断元素是否存在。布隆过滤器适用于海量数据去重、缓存穿透防护、垃圾邮件过滤等场景。文中给出了Java实现示例,包含位数组操作和多个哈希函数的设计。
2025-10-23 14:37:28
537
原创 数据结构--------树&二叉树
树是一种非线性数据结构,用于存储具有"一对多"关系的数据元素。树由结点组成,包括根结点、子结点和叶子结点。二叉树是结点的度不超过2的有序树,分为满二叉树和完全二叉树两种特殊类型。二叉树存储方式包括顺序存储(适用于完全二叉树)和链式存储。遍历方式有前序(根-左-右)、中序(左-根-右)、后序(左-右-根)和层序遍历(按层遍历)。树结构广泛应用于组织架构、目录管理等场景。
2025-10-10 17:09:13
1185
原创 数据结构------二叉查找树
二叉查找树(BST)是一种特殊的二叉树结构,其特点是左子树节点值均小于等于根节点,右子树节点值均大于等于根节点。BST结合了链表快速插入/删除和数组快速查找的优势,广泛应用于文件系统、数据库索引等场景。文章详细介绍了BST的基本结构、节点插入过程(通过示例数组8、3、10等演示)、查找算法(包括最大值和最小值查找),并提供了Java实现代码。BST的中序遍历结果是有序的,这体现了其排序特性。实现部分包含节点类定义、插入方法、初始化方法以及查找相关方法。
2025-10-10 17:08:48
946
原创 数据结构-----线性表
本文系统介绍了线性表的两种主要存储结构:顺序表(数组)和链表。顺序表通过连续内存空间存储数据,支持快速随机访问;链表则采用离散存储,通过指针维持逻辑关系,具有动态扩容优势。文章详细分析了二者的优缺点、时间复杂度以及适用场景,并重点讲解了单链表、双向链表、循环链表等不同链式结构的特点及实现原理。此外,还提供了链表常见操作的代码示例,包括合并有序链表、反转链表、两数相加等算法实现,以及判断链表是否有环、是否相交等经典问题的解决方案。通过对比分析,帮助读者根据具体应用场景选择合适的线性表实现方式。
2025-10-09 16:48:22
927
原创 数据结构-----栈&队列
栈和队列是两种重要的线性数据结构。栈遵循后进先出(LIFO)原则,支持push和pop操作,常用于浏览器历史记录、虚拟机栈等场景。队列遵循先进先出(FIFO)原则,支持offer和poll操作,分为顺序队列和循环队列,可解决"假溢出"问题,应用包括KTV点歌列表、线程池任务队列等。两者可相互实现:用两个队列模拟栈,或用两个栈模拟队列。栈和队列的时间复杂度各有特点:栈的访问为O(n),入出栈为O(1);队列的访问为O(n),插入删除为O(1)。
2025-10-09 16:47:42
1086
原创 分布式事务-Seata
本文介绍了分布式事务的核心概念和Seata框架的解决方案。主要内容包括:1. 分布式事务面临的问题,如跨服务、跨数据库的事务一致性挑战;2. CAP定理的三大特性(一致性、可用性、分区容错性)及其矛盾关系;3. BASE理论作为CAP的解决方案,强调基本可用、软状态和最终一致性;4. Seata框架的四种模式(XA、TCC、AT、SAGA),重点分析了XA和AT模式的实现原理、优缺点;5. Seata的部署配置和微服务集成方法。其中XA模式采用两阶段提交保证强一致性,而AT模式通过数据快照实现最终一致,性能
2025-09-11 17:00:28
1401
原创 RocketMQ
消息中间件是分布式系统中实现异步通信的核心组件,通过消息队列实现系统解耦和异步处理。RocketMQ作为主流消息中间件,包含生产者、消费者、Broker和NameServer四个核心角色,支持同步、异步和单向三种消息发送模式。典型应用场景包括用户注册异步处理(邮件/短信通知)和订单系统解耦(库存通知)。开发时需配置NameServer地址,通过Topic区分消息类型,支持负载均衡和广播两种消费模式。其高吞吐特性(经双11验证)使其成为处理高并发场景的理想选择。
2025-09-10 22:54:38
788
原创 MVCC-多版本并发控制
MVCC(多版本并发控制)是数据库实现高并发的关键技术,通过事务ID、undo日志和版本链实现。InnoDB引擎使用MVCC支持读已提交和可重复读隔离级别,其核心包括:1)每个记录包含事务ID和回滚指针;2)通过ReadView(包含活跃事务列表等信息)判断数据可见性;3)快照读读取历史版本,当前读获取最新数据。MVCC解决了读写冲突问题,但读已提交级别仍存在不可重复读现象。原理上,MVCC结合ReadView和undo日志,通过版本链回溯找到符合事务可见性规则的数据版本。
2025-09-09 23:26:38
808
原创 Shiro概述
摘要:Shiro是Apache旗下的开源安全框架,提供身份认证、授权、加密和会话管理等功能。其核心组件包括Subject(主体)、SecurityManager(安全管理器)、Realm(安全数据源)等。Shiro具有易用性、灵活性和独立性,支持多种数据源和细粒度授权。在SpringBoot集成中,通过自定义Realm实现身份认证(doGetAuthenticationInfo)和授权(doGetAuthorizationInfo),并配置密码比较器等组件。Shiro不依赖Web容器,适用于Web和非Web
2025-09-09 23:25:39
906
原创 MySQL 索引
MySQL索引是提升查询性能的关键工具,主要分为B+Tree和哈希索引两类。B+Tree索引支持范围查询和排序,是MySQL默认选择;哈希索引适用于精确查找但不支持范围查询。索引按使用逻辑分为普通、唯一、主键和全文索引,按实际使用分为单列和组合索引。不同存储引擎(MyISAM和InnoDB)的索引结构存在差异。索引可能因LIKE、OR、函数使用等场景失效。优化索引应遵循离散性高、频繁查询字段优先等原则,避免冗余索引。"回表"指通过二级索引再查主键索引的过程,而"覆盖索引&quo
2025-09-08 22:29:35
894
原创 MySQL 锁机制
数据库锁机制是保证并发访问数据一致性的核心技术。主要包括全局锁(全库只读)、表级锁(锁定整表)、行级锁(锁定单行)和页级锁(介于表行之间)。表级锁分为共享锁(允许多读)和排他锁(独占写),意向锁作为表行锁桥梁。行级锁细分记录锁、间隙锁和临键锁,解决幻读问题。锁机制存在并发控制与系统开销的平衡:锁粒度越小并发越高但开销越大。此外还有乐观锁(无锁验证)和悲观锁(先加锁)两种策略,需警惕死锁发生。合理选择锁类型和优化访问顺序能显著提升数据库性能。
2025-09-08 22:29:19
1138
原创 UDP协议
摘要:UDP(用户数据报协议)是一种无连接的传输层协议,具有简单高效的特点。它不提供可靠性保证、流量控制或拥塞控制,数据传输时可能出现丢包或乱序。UDP首部开销小(8字节),支持一对一、一对多等通信方式,适用于DNS查询、音视频传输、广播等实时性要求高的场景。与TCP相比,UDP无需建立连接,传输效率更高,但可靠性较低,常用于即时通信、直播等对延迟敏感的应用。
2025-09-07 15:33:24
822
原创 MySQL 事务
摘要: 事务是数据库不可分割的工作单元,具有ACID特性:原子性(通过undolog实现回滚)、持久性(通过redolog保障数据安全)、隔离性(通过MVCC或锁机制控制并发)和一致性(前三者的综合结果)。并发事务可能产生脏读、不可重复读和幻读等问题,MySQL提供四种隔离级别应对:读未提交(RU)性能最高但问题最多;读已提交(RC)避免脏读;可重复读(RR,MySQL默认)避免脏读和不可重复读;串行化(SERIALIZABLE)解决所有问题但性能最低。隔离级别越高,数据一致性越好,但并发性能越低。
2025-09-07 15:33:00
1210
原创 HTTP协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于服务器与客户端浏览器之间传输超文本数据(文字、图片、视频、音频)的应用层协议。HTTP是一个属于应用层的协议,同时也是一个双向协议,基于浏览器-服务器架构模型进行工作。浏览器 与 服务器之间,基于http协议进行通信 ,浏览器发送请求数据给服务器,服务器根据接收到并处理请求后,向浏览器发送响应信息。HTTPS 并不是一个新的协议,它使用了隧道进行通信,让 HTTP 先和SSL。
2025-09-06 23:53:45
1088
原创 输入网址到网页显示的整个过程
本文概述了从HTTP请求到网络传输的完整过程:1)浏览器生成HTTP请求报文;2)通过DNS解析获取服务器IP地址;3)协议栈分层处理请求(TCP/UDP传输层、IP网络层);4)TCP协议分割数据并添加头部信息;5)IP协议封装网络包;6)通过MAC地址完成两点传输;7)网卡将数字信号转换为电信号发送。整个过程涉及应用层、传输层、网络层和物理层的协同工作,确保数据可靠传输。
2025-09-06 23:53:27
921
原创 JVM垃圾收集器
本文系统介绍了Java垃圾回收机制的核心内容。首先阐述了判断对象存活的两种算法:引用计数法(存在循环引用问题)和可达性分析法(JVM默认)。接着详细解析了Java的四种引用类型:强引用(不会被回收)、软引用(内存不足时回收)、弱引用(发现即回收)和虚引用(仅跟踪回收)。然后重点讲解了分代收集理论及三大垃圾回收算法:标记-清除(有碎片)、标记-整理(解决碎片)和复制算法(适合新生代)。最后详细对比了主流垃圾收集器的特点:Serial/ParNew(新生代)、Parallel Scavenge/Old(高吞吐)
2025-09-05 23:00:48
951
原创 计算机网络模型
网络模型采用分层设计(如OSI七层/TCP/IP四层)将复杂通信过程拆解为可管理的子任务。每层专注特定功能:应用层处理数据格式(HTTP/DNS等),传输层确保可靠传输(TCP/UDP),网络层负责路由寻址(IP),链路层实现物理传输。分层设计通过标准接口和协议实现模块化,使网络系统更易开发维护。TCP/IP作为实际应用模型,精简为四层结构,各层分工协作完成从用户操作到信号传输的完整通信流程。这种分层架构是计算机网络高效运行的核心基础。
2025-09-05 22:59:31
593
原创 Reflection反射
本文介绍了Java反射机制的核心概念和使用方法。反射允许程序在运行时动态获取类信息并操作对象,主要包括:1. 获取Class对象的三种方式;2. 通过Constructor类创建对象实例;3. 使用Field类访问和修改字段值;4. 利用Method类调用方法(包括静态和非public方法)。文章还详细说明了反射中的继承关系处理、动态加载机制以及多态特性。反射机制突破了Java的访问控制限制,但使用时需注意性能和安全问题。掌握反射技术可以实现更灵活的编程,是Java高级特性的重要组成部分。
2025-09-03 19:13:46
927
原创 JVM虚拟机
Java实现跨平台的核心在于JVM(Java虚拟机)。Java源代码编译后生成字节码文件(.class),JVM负责将其翻译为特定平台的机器码执行。不同平台安装对应版本的JVM即可运行同一份字节码,实现"一次编译,到处运行"。 JVM的关键特性包括: 类加载机制 - 动态加载类到内存,包括加载、验证、准备、解析和初始化阶段 双亲委派模型 - 类加载器层次结构,确保基础类统一 内存管理 - 堆区存储对象实例,分新生代和老年代;元空间存储类信息等 垃圾回收 - 自动管理内存,采用分代收集算法
2025-09-03 19:13:15
1387
原创 synchronized进阶
Java中的synchronized关键字通过锁升级机制优化线程同步性能,包括无锁、偏向锁、轻量级锁和重量级锁四种状态。偏向锁适用于单线程环境,轻量级锁通过CAS操作减少阻塞,重量级锁则在激烈竞争时使用操作系统互斥量。对象头中的MarkWord记录锁状态,Monitor机制实现线程同步。合理选择锁粒度和同步范围可避免性能问题,如死锁和频繁锁升级。线程安全单例模式推荐使用静态内部类或枚举方式实现。
2025-09-02 18:04:28
809
原创 ReentrantLock可重入锁
Java中的ReentrantLock是可重入锁实现,相比synchronized具有更丰富的功能:支持公平/非公平锁、可中断获取锁、超时机制、多条件变量等。其核心方法包括lock()、tryLock()、unlock()等,并可通过状态查询方法检测锁状态。ReentrantLock内部通过Sync、NonfairSync和FairSync三个类实现不同策略。与synchronized相比,ReentrantLock需要显式加锁解锁,但提供了更灵活的锁控制机制,如可中断性、超时等待等特性,适用于更复杂的并发
2025-09-02 18:03:54
940
原创 Redis基础
Redis是一个开源的高性能键值数据库,采用单线程模型却能实现超高吞吐(10万+/秒)。其高效性源于内存操作、高效数据结构、I/O多路复用机制避免了多线程竞争开销。Redis支持多种数据类型:String、Hash、List、Set和Sorted Set,适用于缓存、队列、排行榜等场景。6.0版本前采用纯单线程处理网络I/O和命令执行;6.0后引入多线程网络I/O(默认仅处理响应)以应对网络瓶颈,但命令执行仍保持单线程。这种设计在保证线程安全的同时,充分发挥了内存数据库的性能优势。
2025-09-01 19:15:14
831
原创 Redis持久化、删除策略及企业级解决方案
本文系统介绍了Redis的持久化机制和缓存策略。主要内容包括:1. 持久化机制:详细对比了RDB和AOF两种方式,包括手动/自动保存、配置参数、优缺点等,并推荐两者结合使用;2. 数据删除策略:分析了基于过期时间的定时删除/惰性删除/定期删除三种方式,以及基于内存淘汰的8种逐出算法;3. 企业级缓存解决方案:针对缓存预热、雪崩、击穿、穿透等问题,给出了具体的解决方案和实现建议。文章全面覆盖了Redis数据持久化和缓存管理的核心技术,对实际应用具有重要指导意义。
2025-09-01 19:14:48
1311
原创 SpringBoot自动配置原理
本文深入解析SpringBoot自动配置机制,重点剖析了@Conditional条件注解、@EnableAutoConfiguration实现原理及自定义启动器开发流程。自动配置通过@Conditional系列注解(如@ConditionalOnClass)实现条件化Bean加载,@EnableAutoConfiguration则借助AutoConfigurationImportSelector加载META-INF/spring.factories中的配置类。文章以自定义数据源启动器为例,详细演示了创建自动
2025-08-24 11:47:00
1157
原创 SpringBoot框架启动流程
摘要:SpringBoot应用启动核心流程包括:1)主类通过@SpringBootApplication(含配置、组件扫描和自动配置注解)标记;2)SpringApplication.run()执行分为初始化和运行两阶段,初始化阶段设置应用类型、加载初始化器和监听器;3)运行阶段准备环境、创建应用上下文、刷新容器(含自动配置)并启动内嵌服务器;4)自动配置机制通过条件注解筛选并加载META-INF/spring.factories中的配置类。整个过程通过事件监听机制跟踪各阶段状态,最终完成应用启动。(149
2025-08-24 11:46:42
776
原创 BeanFactory和ApplicationContext区别
ApplicationContext启动后预载入所有的单实例Bean,所以在运行的时候速度比较快,因为它们已经创建好了。t接口作为BeanFactory接口的子接口,包含BeanFactory所具备的功能外,还提供了其它框架功能:继承MessageSource(支持国际化),资源文件访问、可以同时加载多个配置文件 、可以通过监听器管理bean的生命周期;是Spring里面最底层的接口,是IoC的核心,定义了IoC的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理等行为;
2025-08-17 15:16:03
239
原创 Spring Framework
Spring框架是一款轻量级的Java开发框架,核心思想包括IoC(控制反转)和AOP(面向切面编程)。IoC容器通过管理Bean的生命周期和依赖注入实现解耦,支持XML、注解和Java配置类三种配置方式。AOP通过动态代理实现事务管理、日志记录等公共逻辑的模块化。Spring提供多种事务管理方式,包括声明式事务和编程式事务,支持七种传播行为和五种隔离级别。通过三级缓存机制解决循环依赖问题。核心模块涵盖基础功能到企业级应用,简化了JavaEE开发。
2025-08-17 15:14:16
787
原创 MyBatis
MyBatis是一个轻量级的持久层框架,通过XML或注解配置SQL语句,实现Java对象与数据库记录的映射。核心对象包括SqlSessionFactoryBuilder、SqlSessionFactory和SqlSession。MyBatis提供两种SQL配置方式:XML映射(适合复杂SQL)和注解方式(适合简单SQL)。关联查询支持一对一、一对多关系,通过resultMap自定义映射规则。动态SQL功能(if/choose/where/set/foreach标签)简化条件拼接,提高开发效率。使用#{}能有
2025-08-09 15:20:39
806
原创 TCP协议
TCP协议是传输层面向连接的可靠协议,通过三次握手建立连接、四次挥手释放连接。其可靠性由校验和、序号、确认应答、重传机制等保证,流量控制通过滑动窗口实现,拥塞控制采用慢启动、拥塞避免等算法。TCP首部包含端口号、序列号、控制位等字段,通过窗口字段实现流量控制。粘包问题由于TCP的无边界特性产生,可通过自定义协议或发送数据长度解决。
2025-08-09 13:14:59
1022
原创 AQS原理
AQS(AbstractQueuedSynchronizer)是Java并发包中的核心同步框架,通过CLH队列和volatile状态变量state实现线程同步。AQS提供两种模式:独占(如ReentrantLock)和共享,支持公平/非公平锁。ReentrantLock通过实现tryAcquire/tryRelease方法完成加解锁:加锁时根据锁类型执行不同策略,失败线程进入队列;解锁时释放资源并唤醒等待线程。整个过程将自定义逻辑与AQS框架解耦,state变量通过CAS保证原子性,队列机制实现高效线程调度
2025-07-21 18:49:52
596
原创 线程池的状态
线程池状态分为五种:RUNNING(运行中,可接收新任务)、SHUTDOWN(关闭中,不接收新任务但处理队列任务)、STOP(停止中,中断正在执行的任务)、TIDYING(整理中,所有任务终止)和TERMINATED(已终止)。通过shutdown()方法从RUNNING转为SHUTDOWN,shutdownNow()转为STOP。当任务队列和线程池为空时,SHUTDOWN和STOP状态都会进入TIDYING,最终执行terminated()后变为TERMINATED状态。
2025-07-21 18:12:51
328
原创 线程池的核心配置参数和流程
摘要:ThreadPoolExecutor线程池参数详解。corePoolSize为核心线程数(最小保持线程数);maximumPoolSize为最大线程数;keepAliveTime控制非核心线程空闲回收时间;TimeUnit指定时间单位;BlockingQueue为任务队列;ThreadFactory用于创建线程;RejectedExecutionHandler定义任务拒绝策略。核心线程默认不回收,设置allowCoreThreadTimeOut=true可使核心线程超时回收。当线程数超过corePoo
2025-07-19 12:10:58
245
原创 谈谈CAS的理解
CAS(比较并交换)是一种无锁线程同步机制,通过Unsafe类提供的原子操作实现。其核心流程是读取变量值,计算新值后比较内存值是否变化,未变则更新。CAS用于实现原子类(如AtomicInteger)和并发容器操作,具有无阻塞特性但存在循环开销大、仅支持单变量原子操作和ABA问题等缺点。ABA问题指变量值被其他线程修改后又恢复原值,导致CAS误判未变化而继续执行。
2025-07-19 11:53:46
724
原创 进程与线程基础
本文介绍了进程和线程的概念及其区别。进程是操作系统资源分配的基本单位,包含独立内存空间;线程是进程内的执行单元,共享进程资源但拥有独立栈和计数器。线程相比进程创建开销小、切换效率高。文章详细说明了单线程与多线程的运行机制,并提供了Java中四种线程实现方式:继承Thread类、实现Runnable/Callable接口和使用线程池。最后阐述了线程的休眠方法和六种状态(新建、运行、阻塞、等待、计时等待和终止)。
2025-07-16 19:07:47
469
原创 《ArrayList核心代码阅读》
if (newCapacity - MAX_ARRAY_SIZE > 0)// 如果新的容量超过最大容量,则调用 hugeCapacity 方法来处理。if (newCapacity - minCapacity < 0)// 如果新的容量小于最小所需容量,直接将新的容量设为最小容量。if (o.equals(elementData[i]))// 如果数组中的当前元素与给定元素相等,返回索引。if (elementData[i] == null) // 如果数组中当前元素为 null,返回其索引。
2025-02-20 00:09:19
926
原创 Integer缓存池
通过上面的源码我们可以看出,这段代码主要是用来缓存Integer对象,优化在-128到127之间的整数的使用。当你在这范围内创建Integer对象时,JVM 会直接从缓存中取值,而不是每次都新建一个Integer对象,这样可以减少内存开销和提高性能。当然high值可以通过系统属性进行配置,这使得缓存范围可以根据实际需求进行调整。
2025-02-17 16:48:35
592
原创 StringBuilder类的数据结构和扩容方式
是 Java 中用于处理可变字符序列的类,通常用于需要频繁修改字符串内容的场景。与String不同,在对字符串进行操作时不会创建新的对象,而是直接修改原有的字符序列。
2025-02-11 18:07:12
1033
原创 String类的equals()的作用和源代码解读
类来说,比较的是两个字符串的内容,而不是它们的内存地址,因为它重写了Object类中的equals()方法,添加了自己的比较逻辑。所以不能简单的说equals()方法就是比内容,在其没有重写Object类中equals()方法时,还是比较的时内存地址。方法比较的是对象的内存地址,即比较引用是否指向同一个对象。类中的方法,所有Java类都继承自。,因此每个类都可以使用。
2025-01-20 19:42:56
159
原创 String为什么是不可变的?
Java 中的 String 是一个引用数据类型,而不是一个基本数据类型。Java的字符串除了是一个引用类型外,还有个重要特点,就是字符串不可变。
2025-01-20 19:14:41
238
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅