- 博客(53)
- 收藏
- 关注
原创 B + 树索引的工作原理?
当插入导致节点关键字超过m时,会发生分裂:中间关键字上升到父节点,剩余关键字分成两个新节点。B+树通过增加节点分支因子(即每个节点的子节点数)来降低树高。删除记录时,若导致节点关键字数低于阈值,可能需从兄弟节点借关键字或合并节点。所有关键字都出现在叶子节点中,非叶子节点仅作为索引使用。所有数据记录都存储在叶子节点中,且叶子节点形成有序链表。对于等值查询,从根节点开始逐层比较关键字,直到找到目标叶子节点。范围查询时,先定位范围下限所在的叶子节点,然后通过链表指针顺序遍历后续节点,直到超过范围上限。
2025-12-29 19:55:48
148
原创 为什么 InnoDB 默认用 B + 树做索引结构?
所有数据均存储在叶子节点,任何查询都需要从根节点到叶子节点的路径,路径长度恒定。B+ 树是多叉树结构,层数较少(通常 3-4 层),能显著减少磁盘 I/O 次数。相比二叉树(如 AVL 树或红黑树),B+ 树的矮胖结构更适合磁盘这种慢速存储设备。B+ 树非叶子节点仅存储键值(不存数据),单个节点能容纳更多索引项,进一步降低树高。相比 B 树(非叶子节点存储数据),B+ 树的非叶子节点能承载更多分支。由于叶子节点包含全量数据且有序链接,全表扫描时只需遍历叶子节点链表即可,无需访问上层索引结构。
2025-12-29 19:54:19
224
原创 MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
避免了脏读,但仍可能出现不可重复读和幻读问题。这是许多数据库系统的默认隔离级别(如 Oracle、PostgreSQL),但 InnoDB 的默认级别是 REPEATABLE READ。确保在同一事务中多次读取同一数据的结果一致,避免了脏读和不可重复读。通过多版本并发控制(MVCC)和间隙锁(Gap Lock)机制,InnoDB 在此级别下也能避免大部分幻读问题。最低的隔离级别,事务可以读取其他事务未提交的数据(“脏读”)。最高的隔离级别,完全串行化执行事务,避免了脏读、不可重复读和幻读。
2025-12-27 08:19:11
321
原创 MySQL 数据库存储引擎有那些,有什么区别?
InnoDB 适合需要事务、高并发写入的场景(如电商、支付系统)。MyISAM 适合读多写少、无需事务的场景(如日志分析、数据仓库)。InnoDB 具备崩溃恢复能力,通过日志文件(redo log)恢复数据。InnoDB 支持 ACID 事务,适用于需要高可靠性的场景。MyISAM 不支持事务,仅支持表级锁。MyISAM 使用非聚簇索引,索引和数据分开存储。MyISAM 仅支持表级锁,并发写入性能较差。支持高压缩比,适合存储大量历史数据(如日志归档)。数据存储在内存中,读写速度极快,但重启后数据丢失。
2025-12-27 08:18:19
335
原创 幻读是什么?用什么隔离级别可以防止幻读?
幻读(Phantom Read)是数据库并发控制中的一个现象,指在一个事务内多次执行相同的查询,由于其他事务插入或删除了符合查询条件的行,导致前后查询结果不一致。例如:事务A查询年龄小于30的记录,事务B插入一条年龄25的记录并提交,事务A再次查询时发现多了一条记录,这种现象称为幻读。
2025-12-25 08:20:27
222
原创 什么是存储过程?有哪些优点
存储过程(Stored Procedure)是预先编译并存储在数据库中的一组SQL语句集合,可通过名称调用执行。它类似于编程中的函数,支持参数输入和输出,用于封装复杂的数据库操作逻辑。
2025-12-22 08:41:43
184
原创 mysql什么是触发器
触发器(Trigger)是数据库中的一种特殊对象,与表关联并在特定事件(如 INSERT、UPDATE、DELETE)发生时自动执行预定义的 SQL 语句。触发器通常用于实现数据一致性、审计日志、自动化业务逻辑等场景。
2025-12-22 08:40:18
261
原创 SQL注入是什么
SQL注入是一种常见的网络安全攻击技术,攻击者通过在用户输入的数据中插入恶意的SQL代码,欺骗数据库执行非预期的操作。这种攻击通常发生在应用程序未对用户输入进行充分验证或过滤的情况下。应用程序通常会将用户输入的数据拼接到SQL查询语句中。如果输入数据未经过严格处理,攻击者可以构造特殊字符串,改变原SQL语句的逻辑。通过结合技术手段与开发规范,可有效降低SQL注入风险。使密码验证失效,直接登录admin账户。,可能绕过登录验证。
2025-12-18 22:24:43
391
原创 DROP DELETE 和TRUNCATE的区别?
DROP 用于删除整个数据库对象(如表、视图、索引等),包括其结构和数据。DELETE 用于删除表中的特定行数据,保留表结构。TRUNCATE 用于快速删除表中所有数据,保留表结构并重置自增计数器。
2025-12-18 00:08:25
280
原创 什么是Token,Token和Session以及Cookie的区别
服务器为每个用户创建一个唯一的 Session ID,存储在服务器内存或数据库中,并将 Session ID 通过 Cookie 或 URL 传递给客户端。客户端在后续请求中携带 Session ID,服务器通过 ID 查找对应的用户数据。Token 是一种无状态的认证机制,通常由服务器生成并返回给客户端。客户端在后续请求中携带 Token(如放在 HTTP 头部),服务器通过验证 Token 的合法性来判断用户身份。Cookie 是存储在客户端(浏览器)的小型文本数据,由服务器通过 HTTP 响应头(
2025-12-18 00:07:01
451
原创 什么是UUID,怎么组成的?
UUID(Universally Unique Identifier)是一种128位的标识符,用于在分布式系统中唯一标识信息。其设计目标是保证在时间和空间上的全球唯一性,无需中央注册机构即可生成。
2025-12-12 18:54:35
167
原创 双亲委派的概念
Override// 1. 检查是否已加载Class<?try {// 2. 优先自己加载(打破委派)// 3. 失败后再委派父加载器return c;
2025-12-12 14:47:01
299
原创 session和cookie的区别
当用户首次访问网站时,服务器会创建一个唯一的Session ID,并通过Cookie或URL重写的方式将该ID发送给客户端。客户端在后续请求中会携带这个Session ID,服务器根据ID找到对应的Session数据。服务器在用户第一次访问时生成一个唯一的Session ID,通常是一个长随机字符串。服务器根据请求中的Session ID找到对应的存储区,进行数据的读取或修改。不同的服务器和框架可以配置不同的Session超时时间,常见的是30分钟到几小时不等。
2025-12-12 14:45:20
210
原创 Servlet中的doPost和doGet方法有什么区别,它们在传递和获取参数上有什么区别呢?
对应HTTP的GET请求。POST请求将数据放在请求体中,适合传输敏感或大量数据;GET请求将参数附加在URL后,长度受浏览器限制且参数可见。的参数封装在请求体中,不会直接暴露,适合密码等敏感信息。,避免参数被缓存或记录。受URL长度限制(通常约2048字符),形式,数据暴露在地址栏和服务器日志中。理论上无限制,但实际受服务器配置约束。若同一参数名多次出现(如复选框),使用。需手动解码或配置服务器URI编码。对应HTTP的POST请求,的参数通过URL明文传递,如。两者均需显式处理字符编码。
2025-12-10 15:51:21
332
原创 笛卡尔积是什么
笛卡尔积(Cartesian Product)是集合论中的一种运算,指两个集合中所有有序对的集合。若集合 ( A ) 和集合 ( B ) 进行笛卡尔积运算,结果记为 ( A \times B ),其元素形式为 ( (a, b) ),其中 ( a \in A ),( b \in B )。
2025-12-10 15:49:38
296
原创 Servlet的生命周期
Servlet的生命周期由Servlet容器(如Tomcat)管理,主要包括初始化、服务和销毁三个阶段。每个阶段对应特定的方法,开发者可以通过重写这些方法实现自定义逻辑。
2025-12-06 22:02:45
176
原创 POST和GET的区别
选择GET或POST需根据具体需求:GET适合简单、公开的数据获取,POST适合复杂、私密的数据提交。实际开发中应遵循RESTful API设计原则,合理使用这两种方法。
2025-12-04 23:33:24
148
原创 什么是Stream流
进行高效操作(如过滤、映射、排序等)。它不存储数据,而是通过管道(pipeline)对源数据执行一系列惰性计算的中间操作和终端操作。Stream流是Java 8引入的一种处理集合数据的抽象工具,用于以声明式方式对集合(如。Stream流通过链式调用和惰性计算优化性能,尤其适合大数据量或复杂的数据处理流程。
2025-12-03 19:59:57
252
原创 JVM性能调优
提升吞吐量、降低延迟、减少内存占用,确保应用在高负载下稳定运行。调优需结合应用特点、硬件资源和JVM机制进行。调整新生代与老年代比例(默认2,即新生代占1/3)。建议初始值与最大值一致,防止运行时调整堆大小引发性能波动。检查老年代占用率、元空间是否不足,或存在大对象分配。调整Eden与Survivor区比例(默认8)。设置初始和最大堆大小,避免动态扩容开销。Java 8+使用元空间替代永久代,通过。)分析对象引用链,定位未释放对象。适用于大堆和低延迟场景,通过。(目标最大停顿时间)
2025-12-01 10:00:53
307
原创 JVM的内存结构
JVM(Java虚拟机)内存结构是Java程序运行时的核心组成部分,分为多个区域,每个区域负责不同的功能。主要分为线程共享区域和线程私有区域。
2025-12-01 09:58:17
377
原创 垃圾回收算法
基础算法定位标记 - 清除:简单但有碎片,适合临时场景;复制算法:高效无碎片但利用率低,适合低存活占比(新生代);标记 - 整理:无碎片高利用率但有移动开销,适合高存活占比(老年代);实际应用逻辑分代收集是基础策略,结合复制 + 标记 - 整理,覆盖大多数场景;分区收集是大堆优化,通过 Region 按需回收,解决大堆停顿问题;选择原则小堆(<4GB):Serial GC / Parallel GC(吞吐量优先);中堆(4~16GB):G1 GC(平衡停顿与吞吐量);
2025-12-01 09:56:48
776
原创 MyBatis 的设计模型
基于责任链模式(Chain of Responsibility Pattern),通过拦截器(Interceptor)对四大核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)进行扩展。执行器是 MyBatis 的核心调度层,分为简单执行器(SIMPLE)、重用执行器(REUSE)和批处理执行器(BATCH)。封装了 SQL 语句的配置信息(如 ID、参数类型、结果类型、SQL 文本)。解析标签,生成最终可执行的 SQL 语句。
2025-11-27 19:35:26
449
原创 Spring的IoC和DI是什么
IOC是一种设计原则,核心就是将对象的创建、管理(生命周期:创建、初始化、销货)的控制权,从应用程序代码本身转移到Spring容器当中(IOC Container)DI就是实现IOC的具体技术手段,核心是:Spring容器在创建对象的时候,自动将这个对象所依赖的其他对象依赖注入到她里面(注入方式可以是构造器、setter方法等等)IOC:思想 / 原则,将对象的创建、管理控制权从代码转移到 Spring 容器,解耦组件依赖。DI。
2025-11-26 19:21:17
429
原创 什么是反射?
反射的底层依赖JVM的类加载机制,当类被加载的时候,JVM会为每个类生成一个唯一的Class对象(字节码的内存映射),这个对象包含了这个类的所有结构信息(类名、父类、接口、构造器、方法、字段)反射的本质就是通过操作这个Class对象,反相获取类的结构并动态操作,打破了编译器确定类操作的限制。补充:基本数据类型的Class对象比如int.class和包装的TYPE属性比如是说Integer.TYPE是同一个对象,比如int.class == Interger.TYPE结果为true。对象获取成员变量,用于。
2025-11-26 18:59:23
812
原创 Spring 核心注解深度分析
Spring框架的核心幼稚之一是通过注解驱动简化配置,实现组件解耦和功能扩展,注解本质就是元数据标记,Spring容器通过注解解析器识别这些标记,完成组件注册、依赖注入、事务管理等核心功能。
2025-11-21 19:52:47
795
原创 JVM(Java 虚拟机):核心原理、内存模型与调优实践
JVM 的核心是 “内存管理 + 垃圾回收”,掌握其内存模型、GC 原理、类加载机制是调优的基础。依据业务场景(吞吐量 / 低延迟)选择合适的 GC 收集器和参数;避免盲目调优,先通过监控工具定位问题(如 OOM、频繁 GC),再针对性优化;优先优化代码(如避免内存泄漏、减少大对象),再调整 JVM 参数;生产环境建议开启 GC 日志和 OOM 堆快照,便于问题排查。JVM 调优是一个 “迭代优化” 的过程,需结合实际业务压力测试,逐步调整参数,达到最优性能。
2025-11-21 09:04:53
958
原创 线程池的概念
线程池的核心价值是线程复用 + 资源控制,解决了直接创建线程的开销和资源耗尽问题。按任务类型(CPU/IO 密集型)合理配置核心参数;生产环境优先使用,避免Executors;配置有界队列和合理的拒绝策略,防止 OOM;做好监控和优雅关闭,避免线程泄露和数据不一致。
2025-11-21 08:55:29
371
原创 notify()和notifyAll()有什么区别?
摘要:Java中notify()和notifyAll()的主要区别在于唤醒线程的数量和行为。notify()随机唤醒一个线程,适合等待条件相同的场景,但可能引发线程饥饿;notifyAll()唤醒所有线程,确保所有线程都有机会检查条件,但会增大锁竞争开销。二者都需在synchronized块中调用,唤醒后线程需重新获取锁才能执行。核心原则是:不确定时优先使用notifyAll()以避免阻塞风险,明确所有线程任务一致时可使用notify()提升性能。(149字)
2025-11-19 10:05:27
656
原创 什么是多线程死锁,如何预防和解决?
多线程死锁是指两个或多个线程在执行过程中因争夺资源而造成的一种互相等待的现象,导致这些线程都无法继续执行。互斥条件:资源一次只能被一个线程占用。占有并等待:线程持有至少一个资源,同时等待获取其他被占用的资源。不可剥夺:线程已获得的资源在未使用完之前不能被其他线程强行抢占。循环等待:存在一个线程的循环链,每个线程都在等待下一个线程所占用的资源。
2025-11-18 19:27:56
247
原创 synchronized的作用什么
是 Java 中的关键字,主要用于实现线程同步,确保多线程环境下对共享资源的访问安全。块或方法前,线程会清空工作内存中的变量副本,从主内存重新加载数据;退出时会将修改后的值同步到主内存,从而确保其他线程能立即看到最新值。修饰的代码块或方法在同一时间只能被一个线程执行,确保操作的原子性。通过互斥锁防止指令重排序优化破坏代码的逻辑顺序,确保代码执行顺序与程序顺序一致。需显式指定锁对象(可以是任意对象),灵活控制同步范围。),同一实例的多个线程会竞争同一把锁。),所有实例的线程会竞争同一把锁。
2025-11-18 19:24:59
329
原创 Sleep()和wait()的区别
sleep()属于Thread类,是线程 "自身休眠" 的工具,不涉及锁机制;wait()属于Object类,是 "锁对象" 提供的线程通信机制,必须与锁配合使用。这种类归属的差异,本质上是 "单个线程控制" 与 "多线程协作" 两种设计目标的体现。理解这一点,就能从根本上区分两者的用法和场景。
2025-11-17 08:37:34
401
原创 线程、进程、程序的定义以及区别
程序 → 进程:程序被加载到内存执行时成为进程,一个程序可以对应多个进程(如多次启动同一个应用)。进程 → 线程:一个进程至少包含一个线程(主线程),可创建多个线程并发执行,线程是进程的 "子任务单元"。
2025-11-14 08:40:13
269
原创 在JAVA多线程有几种方式
当需要创建大量线程时,频繁创建和销毁线程会消耗大量系统资源。线程池通过预先创建一定数量的线程,复用线程执行多个任务,提高性能和资源利用率。方法),通过实现该接口可以定义线程任务,再将任务传递给。类似,但它可以返回任务执行结果,并且能抛出异常。类是 Java 中线程的基础类,通过继承它并重写。方法是线程的入口点,线程启动后会自动执行该方法。包提供的线程池框架实现,核心接口是。适用于需要返回结果的场景,而继承。接口可以获取异步任务的结果。方法可以定义线程执行逻辑。是一个函数式接口(仅含。
2025-11-14 08:37:30
850
原创 HashMap为什么用key作为键
HashMap用 key 作为 “键”,本质是由其“哈希表的底层原理”和“键值对的功能定位”哈希表需要通过一个 “唯一标识” 计算存储位置并解决冲突,key 恰好满足 “唯一性、可哈希、可比较” 的要求;键值对的核心是 “通过标识找数据”,key 是标识,value 是数据,角色分工天然决定了 key 作为 “键” 的必然性。key 是 “定位器”,value 是 “目标数据”,没有定位器,就找不到数据 —— 这就是 HashMap 用 key 作为键的根本原因。
2025-11-13 02:47:33
875
原创 ConcurrentHashMap和Hashtable的区别
ConcurrentHashMap是Hashtable的现代替代方案,通过细粒度锁(或者无锁机制)实现高效并发,同时支持更多原子操作和弱一致性迭代,性能和功能均远抄Hashtable,实际开发汇总,应该有优先使用ConcurrentHashMap处理并发场景。以哈希桶(数组元素)为单位加索:当线程操作某一个桶的时候,只对这个桶的头节点加synchronized锁,其他的桶可以正常访问,同时结合CAS操作(无所机制)优化读操作和简单写入,进一步提升性能。并发度理论上等于哈希桶数量,锁粒度更细,竞争更小。
2025-11-11 22:11:33
341
原创 HashMap深层结构
HashMap的核心是“数组 + 链表 / 红黑树”的混合结构,通过哈希值快速定位元素,用链表和红黑树处理冲突,通过扩容保证效率。其设计充分利用了哈希表的特性,同时通过红黑树优化极端场景下的性能,是 Java 中最常用的集合类之一。
2025-11-11 21:40:45
1014
原创 什么是面向对象
面相对象本质上是一种模块化和抽象化的思维用类抽象同类事物的共性,用对象表示具体个体用封装明确模块边界,隔离变化用继承和组合实现代码复用,减少冗余用多态统一接口,提高扩展性。
2025-11-10 09:00:34
617
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅