- 博客(67)
- 资源 (1)
- 收藏
- 关注
原创 深入理解 HashMap:从源码到应用的全方位解析
HashMap 是 Java 中常用的数据结构之一,它以键值对的形式存储数据,并且能够在常数时间内完成基本操作。然而,要真正掌握 HashMap 的核心原理,需要深入理解其哈希冲突的解决办法、哈希算法、容量设计、扩容过程、数据结构以及线程安全等方面。本文将从源码角度出发,全面解析 HashMap 的工作机制。
2025-06-05 14:35:55
929
原创 Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景
摘要: Java集合框架中,ArrayList、Vector和LinkedList作为List接口的主要实现,各有特点。ArrayList和Vector基于动态数组,支持快速随机访问(O(1)),但插入删除需移动元素(O(n));LinkedList采用双向链表,插入删除高效(O(1)),但随机访问慢(O(n))。Vector通过同步方法实现线程安全,但性能较差;ArrayList和LinkedList则非线程安全。ArrayList扩容1.5倍,Vector默认2倍。LinkedList还实现Deque接
2025-06-04 11:12:27
758
原创 Java中为什么不能使用for循环遍历list过程中去执行list.remove()删除方法,为什么会报错?
在Java中,使用for循环遍历List时直接调用remove()方法会导致ConcurrentModificationException异常。这是因为增强for循环(for-each)依赖迭代器实现,而普通for循环删除元素会导致索引错乱。正确的删除方式包括:使用迭代器的remove()方法、Java 8的removeIf()方法,或采用倒序遍历普通for循环。这些方法能安全删除元素,避免遍历时出现异常或逻辑错误。
2025-06-04 10:24:59
462
原创 Java 中的 synchronized 和 Lock:如何保证线程安全
Java提供了synchronized和Lock两种机制保证线程安全,前者通过对象监视器和锁升级机制实现同步,后者基于AQS框架提供了更灵活的锁操作。synchronized是JVM内置的同步原语,具有可重入性和自动锁释放特性;而Lock接口(如ReentrantLock)则支持公平/非公平锁、可中断获取等高级功能,需要手动释放锁。两者底层实现都基于线程安全三要素(原子性、可见性、有序性),开发者可根据场景选择——简单同步用synchronized,复杂需求用Lock。
2025-05-29 17:25:29
824
原创 Java 中的 ThreadLocal 详解:从基础到源码
本文深入解析Java中的ThreadLocal机制。ThreadLocal为每个线程提供独立的变量副本,实现线程封闭,避免同步问题。文章从基本使用(get/set/remove方法)开始,详细剖析底层实现原理:ThreadLocalMap作为核心数据结构,采用弱引用的Entry数组存储键值对。特别强调内存泄漏风险(因值对象强引用长期存在)及其解决方案,建议及时调用remove()和使用static修饰。最后介绍典型应用场景如数据库连接管理和用户会话存储,并指出在线程池中的注意事项。通过源码分析和代码示例,全
2025-05-29 15:49:02
819
原创 MySQL 索引详解:从基础到原理
MySQL索引详解摘要 本文全面介绍了MySQL索引的核心概念、类型及优化策略。主要内容包括: 索引概述:定义、作用与代价 常见索引类型:普通索引、唯一索引、主键索引、复合索引、全文索引和空间索引 底层数据结构:B-Tree/B+Tree索引原理,InnoDB的聚簇/辅助索引结构 优化策略:最左前缀原则、索引选择性与基数分析、避免索引失效的方法 通过SQL示例和原理分析,帮助开发者合理设计索引以提升查询性能。
2025-05-29 15:29:06
1054
原创 Spring Boot 启动流程深度解析:从源码到实践
本文深入解析了Spring Boot的启动流程,从源码层面剖析了其核心机制。启动入口从@SpringBootApplication注解的main方法开始,通过SpringApplication.run()方法执行初始化,推断应用类型并加载初始器和监听器。run()方法的核心逻辑包括:准备环境、创建上下文、刷新上下文、发布启动事件等关键步骤。Spring Boot通过事件机制在不同启动阶段发布事件,允许开发者介入。文章通过详细代码示例展示了SpringApplication初始化、环境准备和上下文创建等核心流
2025-05-28 18:17:54
1629
原创 SpringBoot 自动装配原理深度解析:从源码到实践
SpringBoot自动装配机制基于"约定大于配置"理念,核心通过@EnableAutoConfiguration注解触发。AutoConfigurationImportSelector负责处理自动装配流程,从META-INF/spring.factories加载候选配置类,并配合条件注解(如@ConditionalOnClass)进行智能筛选。这种机制减少了样板配置,使开发者只需关注必要差异,体现了SpringBoot的智能化设计理念。
2025-05-28 18:12:14
1265
原创 过滤器和拦截器有什么区别?
摘要: 过滤器(Filter)和拦截器(Interceptor)是Web开发中用于请求处理的两种组件,但存在显著差异: 技术定位:Filter基于Servlet规范,在容器层面处理请求;Interceptor是Spring MVC特有,基于AOP实现。 执行时机:Filter优先触发,处理请求/响应原始数据;Interceptor在控制器前后介入,可访问Spring上下文。 功能场景:Filter适合通用底层处理(如编码、跨域);Interceptor适合业务级控制(如权限、日志)。 注册方式:Filter
2025-05-27 11:16:07
810
原创 Spring 循环依赖:从原理到解决方案的全面解析
本文全面解析Spring框架中的循环依赖问题,主要包括以下内容:1. 定义和分类循环依赖,分为构造器、setter和字段注入三种类型;2. 详细阐述Spring通过三级缓存机制处理setter/字段循环依赖的原理和工作流程;3. 分析构造器循环依赖无法自动解决的原因;4. 提供多种解决方案,包括setter注入替代、@Lazy注解和模块化设计;5. 介绍排查工具和源码分析;6. 总结循环依赖的本质是"早期暴露"机制,强调合理设计依赖关系的重要性。全文深入浅出地讲解了Spring循环依赖的
2025-05-26 14:46:04
806
原创 Java 序列化与反序列化深度解析
Java 序列化与反序列化深度解析:本文全面介绍了Java对象序列化(对象→字节流)与反序列化(字节流→对象)的核心概念、应用场景及实现细节。重点阐述了必须实现Serializable接口的原因、显式指定serialVersionUID的重要性,以及通过transient字段和自定义方法控制序列化过程。文章还分析了序列化在数据持久化、分布式系统和深拷贝中的应用,并指出版本兼容性和安全风险等注意事项,最后提出最佳实践建议,包括合理使用serialVersionUID、处理敏感字段和考虑替代方案等。
2025-05-26 11:52:11
1025
原创 字符编码详解:ASCII、Latin1、Unicode、UTF-8 与 GBK
字符编码是计算机处理文本的基础,常见的编码包括ASCII、Latin1、Unicode、UTF-8和GBK。ASCII是最早的编码标准,仅支持英文字符;Latin1扩展了ASCII,支持西欧语言;Unicode为全球字符提供统一编码,而UTF-8是其最常用的实现方式,具有兼容性和灵活性;GBK是中文专用编码,适用于特定场景。在实际应用中,UTF-8因其全球支持和高效性成为首选,尤其在多语言环境中。理解这些编码的特点和区别,有助于解决乱码和编码转换问题,确保文本处理的准确性。
2025-05-23 16:12:16
760
原创 Redis数据结构详解
Redis 提供了多种数据结构,包括字符串、列表、集合、有序集合、哈希、位图、HyperLogLog、流和地理空间索引。字符串是最基本的数据类型,适用于缓存、计数器和分布式锁等场景。列表是有序集合,常用于消息队列和任务调度。集合是无序且唯一的元素集合,适合标签系统和社交网络。有序集合在集合基础上增加了分数概念,适用于排行榜和延时队列。哈希用于存储键值对映射,适合对象存储和会话管理。位图基于字符串的二进制位操作,适用于存在性判断和用户签到。每种数据结构都有其特定的应用场景和注意事项,合理选择和使用这些数据结构
2025-05-14 16:26:58
827
原创 Spring @Lazy注解详解
@Lazy注解是Spring框架中的一个标记注解,主要用于延迟Bean的初始化。其核心作用包括:1)延迟初始化Bean,避免Spring容器在启动时立即创建所有单例Bean,从而优化资源使用和启动时间;2)解决Bean之间的循环依赖问题。@Lazy通过代理机制实现延迟加载,Spring在容器启动时生成代理对象,并在首次访问时触发实际Bean的创建和依赖注入。该注解可以应用于类、方法、构造器、参数和字段上,但需注意代理开销、配置复杂性以及测试调试中的潜在问题。合理使用@Lazy注解可以有效提升应用性能并解决循
2025-05-14 11:18:52
733
原创 Spring自动装配详解
Spring 自动装配通过依赖注入(DI)机制,简化了对象依赖关系的管理,减少了手动配置的工作量。常见的自动装配方式包括按类型装配(By Type)、按名称装配(By Name)、构造器装配(Constructor)以及使用 @Autowired 注解。按类型装配通过匹配属性类型注入 Bean,要求类型唯一;按名称装配则通过属性名匹配 Bean 名称,适用于多个同类型 Bean 的场景;构造器装配通过构造方法注入依赖,适合强制依赖的场景;@Autowired 注解则支持多种注入方式,灵活性高。Spring
2025-05-13 11:22:03
921
原创 try-catch性能详解!
总的来说,try-catch结构在没有异常发生时对性能的影响通常是可以忽略的,然而,一旦发生异常,其开销可能会显著增加。在实际应用中,开发人员需要在性能和代码的健壮性之间进行权衡:异常处理提供了一种优雅的方式来处理运行时错误,但也可能带来性能开销。在大多数情况下,代码的正确性和可维护性比微小的性能差异更为重要,然而,在一些对性能要求极高的场合,如游戏引擎、实时系统或大规模数据处理系统,开发人员可能需要仔细评估异常处理对性能的影响,并根据具体情况采取相应的优化措施。三两肉。
2024-11-08 10:48:03
1080
原创 RocketMQ消息处理详解!
本文分析了 RocketMQ 同步发送、异步发送和单向发送三种方式的原理、优缺点以及使用场景,并且分析了每种方式涉及到的核心源码。通过上文的介绍可以知道同步发送方式可以保证消息发送时不丢,但是性能相对其他两种方式差一些。三两肉。
2024-10-24 14:15:44
1138
原创 内存溢出与内存泄漏详解!
本文,我们分析了Java的内存溢出和内存泄漏并且应示例展示了它们导致的原因,应该说它们是比较常见的内存管理问题,如果在生产环境出现也是比较头疼的问题。所以在日常开发中,我们一定要注意自己的代码风格和代码质量,尽量避免这些问题的发生。三两肉猿Java。
2024-10-23 15:34:52
1311
原创 Redis内存淘汰机制!
Redis 的内存淘汰机制是其高性能和高可用性的关键保障。通过灵活选择和配置内存淘汰策略,用户可以有效管理内存资源,确保系统的稳定运行。不同的内存淘汰策略适用于不同的应用场景,用户需要根据具体需求进行选择和调优。同时,结合监控和性能测试,用户可以不断优化内存淘汰策略,提升 Redis 的性能和可靠性三两肉猿Java。
2024-10-16 18:15:08
1186
原创 Cookie与Session的区别(特别详细)
Cookie是一种被客户端(通常是浏览器)存储的小型数据文件,服务器发送给客户端后,客户端会在后续向同一服务器的请求中携带这些Cookie数据。这允许服务器识别连续的请求来自同一客户端用户,从而在某种程度上维护状态。Cookie和Session在Web开发中的区别主要体现在数据存储位置、安全性、存储容量和使用场景等方面。选择使用哪种技术或者如何结合使用它们,往往取决于具体项目的需求、安全考虑和性能要求。了解两者的特性,能帮助开发者设计更安全和高效的Web应用程序。三两肉猿Java。
2024-10-16 16:55:35
1041
原创 Linux系统各版本区别,如何选择?
这篇文章,我们分析了 Linux 几种常见的发行版以及它们的优缺点。在实际生产中如何选择,可以参考上面的意见,最终还是需要根据公司或者团队的实际情况来决定。三两肉。
2024-10-16 16:43:55
1524
原创 分布式缓存详解!
分布式缓存是指分布在多个服务器上的缓存。与本地缓存不同,分布式缓存通常部署在独立的应用进程中,并与应用进程部署在不同的机器上。因此,数据读写操作需要通过网络来完成。分布式缓存的主要特点包括:1、可扩展性:当应用程序需要处理大量数据或高并发请求时,可以通过增加服务器节点来扩展分布式缓存的容量和提高性能。2、数据一致性:分布式缓存的数据一致性可以通过各种技术实现,如缓存同步、分布式锁等。3、独立部署:分布式缓存通常部署在独立的应用进程中,与应用程序分离,多个应用可以直接共享缓存。
2024-10-15 18:14:05
1945
原创 布隆过滤器原理及优缺点详解!
布隆过滤器原理及优缺点详解!,布隆过滤器是一种简单但非常有效的数据结构,特别适用于大规模数据的快速查找和去重等场景。尽管它有一定的误判率,但在很多应用中,这一点点误判是可以接受的。三两肉猿Java。
2024-10-14 11:36:30
1235
原创 JDBC存在什么问题?MyBatis是如何解决的?
本文,我们分析了 JDBC的核心组件,使用存在的问题以及 Mybatis如何解决这些问题,对于一些出道比较早或者接触过 JDBC老项目的Java程序员来说,对 JDBC的使用可能还有体感。而现在大部分项目,Hibernate和 Mybatis这些对象关系映射(ORM)框架对 JDBC做了很好的抽象和封装,提供了更加面向对象的数据库操作方式。因此,开发者不需要直接处理 JDBC的API,而是直接面向 ORM。
2024-10-11 10:17:11
842
原创 优秀文章分享:削峰与限流:秒杀场景下的高并发写请求解决方案
削峰:削峰是指通过技术手段将瞬时的高流量分散到一段时间内,从而减小系统的峰值压力。削峰的主要目的是保护系统在高并发请求下不被压垮,确保服务的稳定性。限流:限流是指通过控制请求速率,防止瞬间爆发的流量将系统击垮。限流的主要目的是控制资源的使用,避免系统过载,确保用户请求的合理分配。
2024-10-08 17:43:49
1072
原创 代理服务器详解(proxy server)
代理服务器(Proxy Server)是一个中间服务器,位于客户端和目标服务器之间。客户端请求:客户端(如浏览器)向代理服务器发送请求,例如请求访问一个网站。请求转发:代理服务器接收到客户端的请求后,会将该请求转发给目标服务器。目标服务器响应:目标服务器处理请求并将响应数据发送回代理服务器。响应转发:代理服务器接收到目标服务器的响应后,将其转发回客户端。代理服务器在提供隐私保护、内容过滤、性能优化和负载均衡等方面具有显著优势,但也存在单点故障、性能瓶颈、配置复杂性和隐私安全风险等缺点。
2024-09-03 12:30:40
7401
原创 乐观锁、悲观锁详解
悲观锁(Pessimistic Lock)是一种假设冲突会频繁发生的锁机制。每次数据访问时,都会先加锁,直到操作完成后才释放锁,这样可以确保在锁持有期间,其他线程无法访问这段数据,从而避免了并发冲突。乐观锁(Optimistic Lock)是一种假设冲突不会频繁发生的锁机制。每次数据访问时,不会加锁,而是在更新数据时检查是否有其他线程修改过数据。如果检测到冲突(数据被其他线程修改过),则重试操作或报错。假设前提:悲观锁假设冲突会频繁发生,需要加锁保护。
2024-09-03 11:36:04
1298
原创 Java Regex正则表达式详解
正则表达式(regular expression,常简写为 regex、regexp 或 RE),又称规律表达式、正规表示式、正规表示法、规则运算式、常规表示法,是计算机科学概念,用简单字串来描述、匹配文中全部符合指定格式的字串,現在很多文本编辑器都支援用正则表达式搜寻、取代符合指定格式的字串。Java Regex是一种用于匹配字符串的模式,它可以用来验证、查找、替换或拆分字符串。Pattern Class:表示正则表达式的编译表示。Matcher Class:用于执行匹配操作的引擎。
2024-08-19 17:33:18
1663
原创 CORS 跨域原理解析
CORS,全称为“跨域资源共享”(Cross-Origin Resource Sharing),是一种机制,它使用额外的 HTTP 头来告诉浏览器允许一个网页从另一个域(不同于该网页所在的域)请求资源。这样可以在服务器和客户端之间进行安全的跨域通信。预检请求(Preflight Request):对于某些类型的请求(如使用 HTTP 方法PUT、DELETE,或者请求带有非简单头部),浏览器会首先发送一个OPTIONS请求,这个请求称为“预检请求”。
2024-08-19 15:13:57
1417
原创 扫盲系列:云服务中IaaS, PaaS,SaaS,FaaS的区别!
IaaS,全称 Infrastructure as a Service(基础设施即服务),它是将计算基础设施作为按需服务提供的方法。用户购买服务器、软件数据中心空间或网络设备,并通过完全外包的按需服务模式租用这些资源。PaaS,全称 Platform as a Service(平台即服务),它是一种云交付模型,适用于由第三方管理的服务组成的应用程序。它提供应用程序的弹性扩展,使开发人员可以通过 Internet 构建应用程序和服务,部署模型包括公共、私有和混合
2024-08-16 17:55:40
2042
原创 【开发过程遇到的问题】MySQL插入时间(23点59分59秒)入库后变为第二天0点0分0秒的解决方案(LocalDateTime方式)
【开发过程遇到的问题】MySQL插入时间(23点59分59秒)入库后变为第二天0点0分0秒的解决方案(LocalDateTime方式)数据库入库的时候会有500毫秒的进位,毫秒级有50% 的概率会大于500,所以会有出现入库之后,变成第二天的00:00:00.定义LocalTime做出如下定义。
2024-07-30 11:58:27
1545
原创 常用的SQL聚合函数汇总
常用的SQL聚合函数汇总,COUNT、SUM、AVG、MIN、MAX、GROUP BY 、HAVING、STDDEV、VARIANG、CORR、COVAR、COUNT、GROUP_CONCAT
2024-07-03 14:39:33
2142
原创 如何使用缓存提升SpringBoot性能(EhCache和Redis方式)
缓存是指将文件或数据的副本存储在缓存或临时存储位置中,以便未来对该数据的请求可以更快地提供服务。当从存储中检索数据时,会在缓存中创建该数据的副本。如果再次需要该数据,可以从缓存中比从主存储器中更快地检索到该数据,主存储器可能涉及复杂的计算或较慢的访问速度。如何使用缓存提升SpringBoot性能(EhCache和Redis方式)
2024-07-03 14:15:11
2252
1
原创 源码解读:如何正确使用并区分@Resource和@Autowired注解?
源码解读:如何正确使用并区分@Resource和@Autowired注解?
2024-07-02 15:21:56
1267
原创 干货分享:Spring中经常使用的工具类(提示开发效率)
干货分享:Spring中经常使用的工具类(提示开发效率)资源工具类、对象工具类、数组转换、Stream流操作、系统属性解析、集合工具类、AOP代理工具BeanFactory工具类、注解工具类、Bean工具类、数据验证工具类、XML解析工具类、HTML转换工具类,WEB相关工具类
2024-07-01 11:34:27
1503
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人