- 博客(31)
- 收藏
- 关注
原创 【集合】JDK1.8 HashMap 底层数据结构深度解析
JDK1.8 的 HashMap 通过数组 + 链表 + 红黑树的复合结构,结合哈希函数的扰动优化、高效扩容机制和树化策略,实现了 "查询快、插入快、冲突少" 的核心目标。其设计细节(如 2 的幂容量、0.75 负载因子、8/6 树化阈值)处处体现了 "平衡取舍" 的设计思想。理解这些底层原理,不仅能帮助我们在开发中规避 HashMap 的使用陷阱(如 key 未重写 hashCode/equals 导致的内存泄漏),更能在面试中脱颖而出。建议结合源码调试,观察哈希冲突、扩容、树化的实际过程,加深理解。
2025-07-25 14:27:41
968
原创 【Java新特性】Java 21 新特性全解析
Java 21 作为 LTS 版本,带来了诸多革命性更新:字符串模板简化了字符串处理,序列化集合统一了有序操作,虚拟线程重塑了并发模型,分代 ZGC 提升了性能表现。这些特性不仅提高了开发效率,更拓展了 Java 在高并发、大数据领域的应用能力。
2025-07-20 14:04:31
1188
原创 【Java新特性】Java 17 新特性全解析
Java 17 作为 LTS 版本,不仅通过密封类、switch 类型匹配等特性提升了语言表达能力,还通过新的随机数框架、外部函数 API 等增强了平台的实用性和性能。同时,清理过时特性也让 Java 平台更加轻量和现代。对于开发者而言,升级到 Java 17 不仅能享受这些新特性带来的便利,更是向未来 Java 生态(如虚拟线程、值对象等)过渡的基础。建议从非核心项目开始试点升级,逐步积累迁移经验,充分发挥 Java 17 的技术优势。
2025-07-18 16:28:14
2379
原创 【Java新特性】Java 9 新特性全解析
模块系统从根本上改变了 Java 应用的组织方式,提升了大型应用的可维护性和安全性;语法增强(接口私有方法、钻石操作符升级)和API 优化(集合工厂方法、Stream/Optional 增强)进一步简化了代码编写;工具改进(JShell、Javadoc 升级)让开发和学习过程更高效。对于开发者而言,迁移到 Java 9 不仅能享受这些新特性带来的便利,也是向后续版本(如 Java 11 LTS)过渡的基础。建议从非核心项目开始尝试模块化改造,逐步积累经验,充分发挥 Java 9 的优势。
2025-07-18 07:57:15
1101
原创 【JAVA新特性】Java 8 新特性实战
/ 使用Lambda表达式实现// 加法实现// 乘法实现// 输出8Lambda 表达式和函数式接口促进了函数式编程风格Stream API 实现了数据处理的声明式写法Optional 从根源上减少了空指针异常新日期 API 解决了长期存在的日期处理痛点这些特性共同提升了代码的可读性、简洁性和可维护性。对于开发者而言,掌握这些特性不仅能提高日常开发效率,更是理解现代 Java 编程范式的基础。建议在新项目中全面采用这些特性,并逐步重构旧代码,充分发挥 Java 8 的威力。
2025-07-17 18:13:57
1101
原创 【JVM】深入理解 JVM 类加载器
除启动类加载器外,所有类加载器都有一个父加载器;当需要加载一个类时,当前类加载器会先将请求委派给父加载器,只有父加载器无法加载时,才尝试自己加载。这里的 “双亲” 并非指两个父加载器,而是层级委派关系(更准确地说应称为 “单亲委派”)。类加载器之间的父子关系通过组合而非继承实现(类通过parent字段持有父加载器引用)。JVM 允许开发者通过继承类实现自定义类加载器,以满足特殊需求(如加密字节码、从网络加载类等)。// 类加载路径@Overridetry {// 1. 读取字节码文件。
2025-07-17 14:40:47
866
原创 【JVM】内存分配与回收原则
JVM 的内存分配与回收机制是自动内存管理的核心,其设计遵循 "分代收集" 思想,通过不同区域的针对性策略实现高效的内存管理。理解这些原则有助于开发者写出更优的代码,避免常见的内存问题(如 OOM),并在必要时进行有效的性能调优。掌握内存分配规律、GC 触发机制和引用类型特性,是深入理解 JVM 的重要一步,也是应对高并发、高性能场景的必备知识。
2025-07-16 16:15:00
1316
原创 【JVM】运行时数据区域
Java 虚拟机在执行 Java 程序时,会将管理的内存划分为若干个不同的数据区域。这些区域有着明确的职责分工,部分区域随线程创建而存在,随线程销毁而消失(线程私有),部分区域则被所有线程共享(线程共享)。值得注意的是,Java 虚拟机规范对这些区域的规定较为宽松。例如,堆可以是连续空间也可以是不连续空间,大小可以固定也可以动态扩展,垃圾回收算法也未做强制要求 —— 这为不同虚拟机实现提供了灵活度,但也要求开发者理解其共性设计。为什么 JDK1.8 移除永久代?永久代大小固定,易引发;
2025-07-16 08:48:20
1452
原创 【Spring】循环依赖
循环依赖(Circular Dependency)是指两个或多个模块、对象之间相互依赖,形成一个封闭的依赖环。简而言之,模块A依赖于模块B,而模块B又依赖于模块A,这会导致依赖链的循环,无法确定加载或初始化的顺序。@Service@Autowired@Service@Autowired//或者自己依赖自己@Service@Autowired。
2025-03-18 21:48:45
1130
原创 线程池原理
线程池是一种池化技术,用于预先创建并管理一组线程,避免频繁创建和销毁线程的开销,提高性能和响应速度。核心线程数最大线程数空闲存活时间单位时间任务队列线程工厂和拒绝策略。corePoolSize:核心线程数,即线程池中始终保持的线程数量。maximumPoolSize:最大线程数,即线程池中允许的最大线程数量。keepAliveTime:线程空闲时间,超过这个时间的非核心线程会被销毁。workQueue:任务队列,存放待执行的任务。hreadFactory:线程工厂,用于创建新线程。
2025-03-15 16:39:01
3012
原创 【Redis】 分布式锁
分布式锁是控制分布式系统间同步访问共享资源的一种方式,其可以保证共享资源在并发场景下的数据一致性。为了达到同步访问,让这些线程在访问共享资源之前先要获取到一个令牌 token,只有具有令牌的线程才可以访问共享资源。这个令牌就是通过各种技术实现的分布 式锁。而这个分布锁是一种“互斥资源”,即只有一个。只要有线程抢到了锁,那么其它线 程只能等待,直到锁被释放或等待超时。
2024-05-20 16:16:03
1498
原创 【Redis】 Redis 缓存
1)在配置文件中注册Redis连接信息与缓存信息2)需要缓存到Redis中的实体类必须要序列化3)Spring Boot 启动类中要添加@EnableCaching注解4)查询方法上要添加@Cacheable注解5)对数据进行写操作的方法上添加@CacheEvict注解6)对于需要手工操作Redis的方法,需通过RedisTemplate来获取操作对象。
2024-05-20 16:15:31
931
原创 【Redis】Redis 分布式系统
分布式数据库系统会根据不同的数据分区算法,将数据分散存储到不同的数据库服务器 节点上,每个节点管理着整个数据集合中的一个子集。与。
2024-05-16 10:04:56
736
原创 【Redis】Redis 主从集群(二)
Sentinel 维护着三个定时任务以监测 Redis 节点及其它 Sentinel 节点的状态1)info 任务:每个 Sentinel 节点每 10 秒就会向 Redis 集群中的每个节点发送 info 命令,以获得最新的 Redis 拓扑结构2)心跳任务:每个Sentinel节点每1秒就会向所有Redis节点及其它Sentinel节点发送一条ping命令, 以检测这些节点的存活状态。该任务是判断节点在线状态的重要依据。
2024-05-15 09:57:42
1408
原创 【Redis】Redis 主从集群(一)
为了避免 Redis 的单点故障问题,可以搭建一个 Redis 集群,将数据备份到集群中的其它节点上。若一个 Redis 节点宕机,则由集群中的其它节点顶上。
2024-05-14 12:23:33
1302
原创 【Redis】Redis持久化
Redis 是一个内存数据库,所以其运行效率非常高。但内存中的数据是不持久的,若主机宕机或 Redis 关机重启,则内存中的数据全部丢失。这是不允许的。Redis 具有持久化功能,其会按照设置以快照或操作日志的形式将数据持久化到磁盘。根据持久化使用技术的不同,Redis 的持久化分为两种:RDB 与 AOF。
2024-05-13 19:41:51
1324
原创 【Redis】Redis 事务
Redis 的事务的本质是。这组命令在执行过程中会被顺序地、一次性 全部执行完毕,只要没有出现语法错误,这组命令在执行期间不会被中断。
2024-05-11 19:14:41
670
原创 【Redis】集合的底层实现原理
zipList称为压缩列表,是一个经过特殊编码的用于存储字符串或整数的双向链表。其底层数据结构由 head、entries 与 end 三部分构成。这三部分在内存上是连续存放的listPack 也是一个经过特殊编码的用于存储字符串或整数的双向链表。其底层数据结构也由head、entries 与 end 三部分构成,且这三部分在内存上也是连续存放的跳跃列表是一种随机化的数据结构,基于并联的链表,实现简单, 查找效率较高。在链表的基础上增加了跳跃功能,使得在查找元素时,能够提供较高的效率。
2024-05-10 09:16:21
1728
原创 【Redis】简单动态字符串 SDS
虽然 Redis 是使用标准 C 语言开发的,但并没有直接使用 C 语言中传统的字符串表示,而是自定义了一 种字符串。这种字符串本身的结构比较简单,但功能却非常强大,称为简单动态字符串,简称 SDSRedis 中的所有字符串并不都是 SDS,也会出现 C 字符串。C 字符串只会出现在字符串“字面常量”中,并且该字符串不可能发生变更。
2024-05-09 09:13:28
1267
原创 【Redis】Redis命令(四)
一种由三部分构成的集合,这种数据结构称为空间元素。经度(longitude):有效经度为[-180,180]。正的表示东经,负的表示西经;纬度(latitude):有效纬度为[-85.05112878,85.05112878]。正的表示北纬,负的表示南纬;位置名称:为该经纬度所标注的位置所命名的名称,也称为该 Geospatial 集合的空间元素名称。
2024-05-08 08:56:49
1018
原创 【Redis】Redis命令(三)
有序 Set 中的每一个元素都有一个分值 score,Redis 会根据 score 的值对集合进行由小到大的排序。元素不能重复,但元素的 score 可以重复。由于该类型的所有命令均是字母 z 开头,所以该 Set 也称为 ZSet。
2024-05-07 09:38:03
1969
原创 【Redis】Redis命令(二)
Hash 表就是一个映射表 Map,由键值对构成,为和DB的 key 进行区分,Hash的键称为 field,值称为 value。field-value 对均为 String 类型。
2024-05-06 09:17:01
950
原创 【springMVC】@RequestMapping的作用
将指定 URL 的请求绑定到一个特定的方法或类上,从而实现对请求的处理和响应。RequestMapping注解只能出现在类上或者方法上。
2024-04-26 09:08:33
1542
原创 【springMVC】了解springMVC
如下是Spring架构图,其中Web中的servlet指的就是Spring MVC:与纯粹的Servlet开发区别:1)入口控制:SpringMVC框架通过DispatcherServlet作为入口控制器,负责接收请求和分发请求。Servlet开发中,需要自己编写Servlet程序,在web.xml中进行配置,才能接受和处理请求。
2024-04-26 09:07:03
625
1
原创 【spring6】事务
什么是事务:在一个业务流程当中,通常需要多条DML(insert delete update)语句共同联合才能完成,这多条DML语句必须同时成功,或者同时失败,这样才能保证数据的安全。多条DML要么同时成功,要么同时失败,这叫做事务事务的四个处理过程:开启事务;执行业务代码;提交事务;回滚事务事务的四个特性:1):事务是最小的工作单元,不可再分2):事务要求要么同时成功,要么同时失败。事务前和事务后的总量不变3):事务和事务之间因为有隔离性,才可以保证互不干扰4):持久性是事务结束的标志。
2024-04-25 10:06:31
1539
1
原创 【spring6】面向切面编程AOP
AOP是对OOP(面向对象编程)的补充延伸,底层使用的就是动态代理(JDK动态代理 + CGLIB动态代理技术)来实现的。应用:一个系统会有,例如:日志、事务管理、安全等。交叉业务代码在多个业务流程中反复出现,这个交叉业务代码没有得到复用,并且修改这些交叉业务代码的话,需要修改多处。程序员无法专注核心业务代码的编写,在编写核心业务代码的同时还需要处理这些交叉业务。使用AOP可以解决这些问题。优点:1)代码复用性增强;2)易于维护;3)使开发者更关注业务逻辑。
2024-04-24 09:14:38
1813
原创 【spring6】代理
23种设计模式之一。作用:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不应该看到的内容和服务或者添加客户需要的额外服务。通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。角色:代理类(代理主题);
2024-04-24 09:13:00
777
原创 【spring6】Bean的生命周期
Bean生命周期可以粗略的划分为五大步:1)实例化Bean2)Bean属性赋值3)初始化Bean4)使用Bean5)销毁Bean。
2024-04-22 15:50:07
557
原创 【mybatis】缓存
缓存的作用:通过减少IO的方式,来提高程序的执行效率。mybatis的缓存:将select语句执行结果存到缓存(内存),当下次执行这条select语句时,直接从缓存中取,不在查询数据库,既减少IO,又不用执行繁琐的查询算法,提高效率。缓存机制只针对select语句。mybatis缓存包括:一级缓存:将查询到的数据存到SqlSession中二级缓存:将查询到的数据存到SqlSessionFactory中集成其他缓存:如EhCache。
2024-04-17 10:04:22
1003
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅