
JAVA学习笔记
文章平均质量分 86
以 Java 技术栈为脉络,从基础语法、面向对象深入,到集合框架、并发编程、JVM 原理,结合实战案例拆解开发场景,梳理代码优化、框架应用(Spring 等)思路,积累高效编码经验,助力构建扎实 Java 技术体系 。
笑衬人心。
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线程崩溃是否导致进程崩溃
文章摘要: 栈溢出不会影响其他进程,因为每个进程拥有独立的虚拟地址空间,越界访问会被操作系统隔离。线程崩溃是否导致进程崩溃需分情况:Java子线程未捕获异常仅终止自身;主线程异常可能引发JVM退出;C/C++线程段错误或调用exit()会终止整个进程,而pthread_exit()不影响其他线程。线程破坏共享资源可能间接导致进程不稳定。建议通过异常处理器(如Java的UncaughtExceptionHandler)增强多线程健壮性。栈溢出和线程崩溃的影响范围取决于异常类型和系统处理机制。原创 2025-07-29 22:49:48 · 1105 阅读 · 0 评论 -
对象的创建过程
Java对象创建过程主要分为五个步骤:首先检查类是否已加载,未加载则触发类加载过程;接着在堆中分配内存,根据堆规整性选择指针碰撞或空闲列表方式;然后将实例字段初始化为零值;随后设置对象头,包含类元数据、哈希码等信息;最后执行构造方法完成初始化。整个过程涉及JVM底层机制,内存分配方式与GC算法相关,且需要考虑线程安全问题。原创 2025-07-29 22:29:56 · 751 阅读 · 0 评论 -
JVM 内存共享区域详解
本文系统介绍了JVM内存结构,重点分析了共享内存区域。JVM内存分为线程共享和非共享区域,共享区域包括堆(存储对象实例)、方法区(存储类信息、静态变量等)、运行时常量池和字符串常量池。其中,JDK 1.8将方法区实现由永久代改为元空间,字符串常量池也从永久代迁移到堆中。非共享区域包括程序计数器、虚拟机栈和本地方法栈。文章还对比了各区域特点,并总结了面试常见考点,如内存结构变化、直接内存使用等。原创 2025-07-28 23:29:06 · 1231 阅读 · 0 评论 -
lock 和 synchronized 区别
本文对比了Java中两种线程同步机制:synchronized关键字和Lock接口。synchronized是内置关键字,使用简单但功能有限,自动加锁/解锁,不支持中断和公平锁。Lock是显式接口,提供更灵活的锁控制,支持中断、超时、公平锁及读写锁等特性,但需手动释放锁。synchronized适合简单同步场景,而Lock适用于高并发和复杂控制需求。开发者应根据具体场景选择合适的同步工具,以优化性能和可维护性。原创 2025-07-25 20:53:35 · 1267 阅读 · 0 评论 -
Java 并发容器:ConcurrentHashMap 笔记(JDK 1.8)
ConcurrentHashMap是Java中线程安全的高效哈希表实现,采用锁分离+CAS+红黑树优化方案。JDK1.8版本摒弃了1.7的分段锁设计,改用数组+CAS+synchronized+红黑树结构,通过细粒度的桶位节点锁提升并发性能。核心机制包括:无锁读操作、CAS乐观锁插入、synchronized锁冲突节点、多线程协作扩容等。相比HashMap和Hashtable,它具备更高的并发安全性,但不支持null键值。其优化特性包括红黑树转换、弱一致性遍历和多线程扩容,特别适合高并发场景下的共享数据访问原创 2025-07-24 17:33:29 · 1071 阅读 · 0 评论 -
Hashtable 与 HashMap 的区别,以及为何 Hashtable 已经过时
本文对比了Java中Hashtable和HashMap的主要区别,分析了Hashtable过时的原因。Hashtable作为早期线程安全实现,采用粗粒度锁导致性能低下,不支持null键值,且使用过时的Enumeration遍历方式。相比之下,HashMap功能更全面、灵活性更高,在多线程场景下推荐使用ConcurrentHashMap。官方已明确建议用HashMap(非并发场景)和ConcurrentHashMap(并发场景)替代Hashtable,新项目应避免使用这一过时类。原创 2025-07-24 11:22:39 · 412 阅读 · 0 评论 -
Java 抽象类 vs 接口(Abstract Class vs Interface)对比笔记
抽象类与接口是Java中两种抽象机制。抽象类用于定义通用父类(abstract class),支持继承(extends)、含构造器和成员变量,但仅支持单继承;接口(interface)定义行为规范,通过implements实现,支持多继承,仅含常量及抽象/默认方法(Java 8+)。核心区别:抽象类强调“是什么”(is-a),接口聚焦“能做什么”(can-do)。选择依据:需代码复用选抽象类,需多态扩展选接口。现代接口还支持default/static方法(如日志工具),增强灵活性。实际开发中可组合原创 2025-07-23 14:41:25 · 543 阅读 · 0 评论 -
Java 中 == 与 equals()的区别笔记
Java中==和equals()的区别: ==是运算符,比较基本类型的值或引用类型的地址; equals()是Object类方法,默认比较对象地址,但可被重写(如String类重写为比较内容)。 使用时建议: 判断对象内容是否相等用equals(); 判断是否为同一对象引用用==; 注意字符串常量池和堆对象的地址差异。 核心区别在于==比较内存地址,equals()可根据需求自定义比较逻辑。原创 2025-07-23 11:29:51 · 504 阅读 · 0 评论 -
了解类加载器吗?类加载器的类型有哪些?
类加载器(ClassLoader)是JVM的核心组件,负责将.class文件加载到内存并生成Class对象。JVM内置三类加载器:Bootstrap(核心类库)、Extension(扩展类)、Application(应用类),支持自定义类加载器。类加载采用双亲委派机制,优先委派父加载器处理,确保核心类安全并避免重复加载。自定义类加载器通过继承ClassLoader实现,常用于热部署、插件系统等场景。线程上下文类加载器(如SPI)可突破双亲委派限制。理解类加载机制对Java模块化开发和安全部署至关重要。原创 2025-07-21 23:01:29 · 1321 阅读 · 0 评论 -
JVM 类加载过程笔记
JVM类加载过程详解:从字节码到可执行对象 摘要:JVM类加载是将.class文件转换为可执行对象的过程,分为加载、验证、准备、解析和初始化五个核心阶段。加载阶段读取字节码并生成Class对象;验证确保代码安全性;准备分配静态变量内存;解析转换符号引用;初始化执行静态代码块。JVM采用双亲委派模型,通过启动类加载器、扩展类加载器和应用类加载器实现层次化加载。类卸载需满足Class对象和类加载器均无引用条件。该机制保证了Java程序的安全性和灵活性,支持动态扩展和自定义加载逻辑。原创 2025-07-21 22:01:57 · 1168 阅读 · 0 评论 -
Java 创建线程的方式笔记
Java创建线程主要有四种方式:继承Thread类(简单但耦合度高)、实现Runnable接口(任务与线程分离,推荐)、实现Callable接口(支持返回值和异常)、使用线程池(资源复用,生产环境首选)。线程池是最佳实践,支持任务调度、资源控制和拒绝策略。推荐使用ThreadPoolExecutor构造线程池,避免直接new Thread()。对于定时任务可用ScheduledExecutorService。此外,Callable+Future适合需要获取结果的异步任务,而Java8+的Lambda可以简化原创 2025-07-20 16:54:32 · 836 阅读 · 0 评论 -
ThreadLocal 在 Spring 与数据库交互中的应用笔记
ThreadLocal是Java提供的线程本地存储工具,在Spring事务管理中发挥关键作用。它通过线程隔离机制确保同一线程内的数据库操作共享一个连接,支持事务一致性和传播机制。Spring利用ThreadLocal缓存连接对象、跟踪事务状态,并通过TransactionSynchronizationManager进行资源绑定。使用时需注意内存泄漏风险,避免跨线程使用连接。该机制实现了连接池与Spring事务的高效协同,保证事务上下文的线程安全性。核心价值在于:线程级连接共享、事务状态管理和资源生命周期控制原创 2025-07-18 20:36:28 · 984 阅读 · 0 评论 -
RPC 与 Feign 的区别笔记
RPC与Feign技术对比摘要: RPC(如gRPC、Dubbo)采用二进制协议实现高效远程调用,适合高性能场景;Feign是Spring Cloud封装的声明式HTTP客户端,基于RESTful风格,开发便捷但性能中等。核心差异:RPC通过TCP长连接传输,支持多语言但调试复杂;Feign基于HTTP/JSON,易集成易调试。选型建议:内部高性能通信选RPC,常规微服务调用优先Feign。二者在Spring Cloud生态中可互补,Feign处理服务间HTTP调用,RPC用于特定高并发场景。原创 2025-07-18 20:31:37 · 1214 阅读 · 0 评论 -
Spring的`@Value`注解使用详细说明
Spring的@Value注解主要用于从外部配置文件(如application.properties)或表达式注入属性值到Bean中。它支持注入常量、默认值、SpEL表达式结果、集合类型及复杂数据结构。通过${}引用配置文件属性,#{}使用SpEL表达式,还可注入方法参数和构造函数参数。该注解简化了配置管理,支持灵活的动态值注入,是Spring应用开发中处理外部配置的重要工具。原创 2025-07-14 22:04:08 · 675 阅读 · 1 评论 -
Dubbo 学习笔记
Dubbo是阿里开源的分布式RPC框架,提供高性能远程调用、服务注册发现、负载均衡、容错等功能。其架构包含Provider、Consumer、Registry等核心组件,支持多种通信协议和序列化方式。通过SpringBoot可以快速搭建服务,开发者只需定义接口、添加注解即可实现远程调用。Dubbo采用SPI机制实现扩展功能,提供随机、轮询等负载均衡策略,以及失败重试等容错策略。常见问题包括服务注册失败、调用缓慢等。建议从官方文档入手,逐步掌握基础概念、实战搭建和源码分析。原创 2025-07-14 18:29:56 · 851 阅读 · 0 评论 -
Spring 是如何解决循环依赖的
循环依赖是指多个Bean相互注入形成闭环,导致依赖无法解析。Spring通过三级缓存机制解决该问题:一级缓存保存已初始化Bean,二级缓存存放提前曝光的半成品Bean,三级缓存存储生成早期引用的工厂。在字段/Setter注入时,Spring允许未完成的Bean被引用,从而打破循环;但构造器注入无法解决,因需完全初始化才能暴露对象。建议避免循环设计或使用@Lazy延迟注入。核心原理是三级缓存的协作:当检测到循环时,从缓存中获取早期引用完成依赖注入,待Bean初始化完成后再移入一级缓存。 (149字)原创 2025-07-14 11:17:05 · 777 阅读 · 0 评论 -
Hashtable 与 HashMap 的区别笔记
Java中的Hashtable和HashMap都是实现Map接口的哈希表类,但存在关键差异:Hashtable线程安全但性能较低,不允许空键值,使用过时的Enumerator迭代器;HashMap非线程安全但性能更高,允许空键值,使用现代Iterator,扩容效率更好。Hashtable继承自Dictionary类,而HashMap直接实现Map接口。现代开发中更推荐使用HashMap,线程安全场景可用ConcurrentHashMap替代Hashtable。原创 2025-07-13 20:18:14 · 664 阅读 · 0 评论 -
ConcurrentHashMap笔记
ConcurrentHashMap是Java中高效的线程安全哈希表实现,位于java.util.concurrent包。它采用分段锁机制,允许多线程并发访问不同段的数据,避免了传统Hashtable的全表锁性能瓶颈。JDK7使用Segment数组实现分段锁,而JDK8优化为无Segment结构,引入CAS操作和红黑树优化,进一步提升并发性能。主要特点包括非阻塞读取、高效并发更新和弱一致性迭代器。相比HashMap和Hashtable,它在高并发环境下性能更优,特别适合频繁读写场景。虽然写操作仍受锁影响,但整原创 2025-07-13 20:14:54 · 755 阅读 · 0 评论 -
Java 中线程通信方式笔记
本文介绍了Java中多种线程通信方式及其适用场景。主要包括:wait/notify基础同步机制、join线程串行、volatile状态可见性、LockSupport无锁阻塞、Condition多条件控制、BlockingQueue生产者消费者模式,以及CountDownLatch、CyclicBarrier、Semaphore等并发工具,最后还介绍了Future和CompletableFuture异步编程方式。每种方法都有其特点,如是否需要阻塞、是否配合锁使用等,可根据具体需求选择合适的通信机制来实现线程间原创 2025-07-11 17:27:04 · 472 阅读 · 0 评论 -
G1 垃圾回收算法详解
G1垃圾回收器是JDK 9及以后版本的默认GC,专为多核大内存服务器设计,兼顾吞吐量和低延迟。它将堆划分为多个Region,采用分阶段回收策略(初始标记、并发标记、最终标记、筛选回收),通过混合回收减少Full GC。相比传统GC,G1提供可预测的停顿时间(可配置MaxGCPauseMillis),但处理大对象时仍有不足。调优建议包括设置合理堆大小、监控关键指标等。G1在响应性和吞吐量间取得平衡,是CMS的理想替代方案。原创 2025-07-11 17:10:52 · 770 阅读 · 0 评论 -
Java 17 新特性笔记
Java 17是2021年9月发布的长期支持版本(LTS),主要特性包括:1)语言增强如封闭类(Sealed Classes)、switch模式匹配预览和正式化的instanceof模式匹配;2)API改进如强封装内部API、新RandomGenerator接口、Foreign Memory API和Vector API(均为孵化);3)移除Applet等旧特性;4)JVM性能优化如ZGC和Shenandoah GC稳定化。该版本整合了Java 12-16的多项特性,在安全性、性能和开发效率方面均有提升。作原创 2025-07-09 17:37:07 · 1103 阅读 · 0 评论 -
Java 8 相对于 Java 7 的新增特性笔记
Java 8是2014年发布的革命性版本,引入了多项重要特性:1)Lambda表达式简化函数式编程;2)函数式接口与方法引用;3)Stream API支持集合函数式操作;4)接口默认方法;5)Optional类避免空指针;6)新日期时间API;7)重复注解与类型注解;8)Nashorn JavaScript引擎;9)并发与集合类优化。这些改进使Java更现代化,提升开发效率与代码可读性。原创 2025-07-09 17:33:35 · 351 阅读 · 0 评论 -
Java 双亲委派机制笔记
双亲委派机制是Java类加载的核心机制,它通过层级委托方式确保类加载安全性和一致性。该机制要求类加载器先委托父加载器加载类,只有父加载器无法完成时才自行加载。Java类加载器分为启动类、扩展类、应用类和自定义类加载器,共同构成树形结构。双亲委派的优点包括避免类重复加载、保障安全性和类型一致性。但在SPI、Web容器等场景下需要打破该机制。类隔离由"类名+加载器"共同决定,不同加载器加载的相同类被视为不同类型。理解双亲委派机制对掌握Java类加载原理至关重要。原创 2025-07-06 19:43:33 · 991 阅读 · 0 评论 -
Java NIO 模型笔记
本文介绍了Java NIO(New I/O)的核心概念与工作机制。主要内容包括:NIO与BIO的对比,NIO三大核心组件(Channel、Buffer、Selector)的详解,以及NIO的工作流程图和示例代码。NIO采用非阻塞和选择器机制,适合高并发服务器开发,但编程复杂度较高。文章还提及基于NIO的Netty框架,建议实际开发中使用Netty等高层封装框架。全文系统性地阐述了NIO的特性、优缺点及适用场景,为构建高性能网络应用提供了技术参考。原创 2025-07-06 10:39:30 · 1030 阅读 · 0 评论 -
Java 创建对象过程 & JVM 内存分配并发安全笔记
Java对象创建过程详解:1)类加载检查确保类已加载;2)内存分配采用指针碰撞或空闲列表策略,并使用CAS/TLAB保证并发安全;3)初始化包括空间清零、设置对象头和调用构造方法。对象内存结构包含对象头、实例数据和对齐填充。JVM通过逃逸分析优化可能将对象分配在栈上。常见创建方式包括new、反射和clone等,各具特点。面试常考察创建步骤、并发安全机制和分配位置优化等核心问题。原创 2025-07-05 16:52:30 · 1049 阅读 · 0 评论 -
Java 并发核心:AQS(AbstractQueuedSynchronizer) 详解
AQS(AbstractQueuedSynchronizer)是Java并发包的核心同步框架,用于构建锁和同步器。它通过FIFO队列管理线程状态,提供独占和共享两种模式。核心包括volatile的state变量、CLH队列和模板方法(tryAcquire/tryRelease)。工作流程涉及获取锁(失败入队阻塞)、释放锁(唤醒后续线程)。典型应用包括ReentrantLock、Semaphore等。AQS封装了底层线程调度,具有高复用性,但需注意死锁和性能问题。ReentrantLock通过继承AQS实现公原创 2025-07-04 22:46:33 · 1354 阅读 · 0 评论 -
Java 中的锁机制详解
Java 提供了丰富的锁机制实现多线程并发控制,主要包括内置锁synchronized和JUC显式锁。锁的分类维度包括实现层面、可重入性、公平性、读写粒度等。常见锁类型有:synchronized(简单同步)、ReentrantLock(高级控制)、ReadWriteLock(读多写少)、StampedLock(高性能读写)以及乐观锁(CAS)。JVM会自动进行锁升级(偏向锁→轻量级→重量级)。选型需考虑线程竞争程度、读写比例、功能需求(如公平性、中断响应)和性能要求,合理使用锁能有效避免死锁并优化并发性能原创 2025-07-04 22:39:03 · 682 阅读 · 0 评论 -
HTTPS详解:原理 + 加解密过程 + 面试问答
HTTP与HTTPS的核心区别在于安全性:HTTP明文传输(80端口),HTTPS通过TLS加密(443端口)。HTTPS实现三大安全目标:机密性(对称加密)、身份认证(数字证书)、完整性校验(摘要算法)。TLS握手采用混合加密:非对称加密交换密钥,对称加密传输数据。TLS 1.3比1.2更快更安全(0-RTT、强加密)。数字证书由CA签发,浏览器验证防止中间人攻击。HTTPS适用于所有需保密的场景(登录、支付等),是当前网络安全的基础保障。原创 2025-07-02 18:57:10 · 931 阅读 · 0 评论 -
Java ArrayList 扩容机制
ArrayList是Java中基于数组实现的可变长度列表,支持随机访问和动态扩容。其底层使用Object[]数组存储元素,默认初始为空数组,首次添加元素时扩容至10。扩容机制采用1.5倍增长策略,通过Arrays.copyOf()复制数组,时间复杂度为O(n)。为避免性能损耗,建议预估容量并指定初始大小或提前调用ensureCapacity()。最大容量限制为Integer.MAX_VALUE-8。与默认构造相比,指定初始容量可显著提升性能。原创 2025-07-01 17:01:21 · 431 阅读 · 0 评论 -
java 线程池参数选择原则
本文详细介绍了Java线程池ThreadPoolExecutor的核心参数配置方法。重点解析了corePoolSize、maximumPoolSize、keepAliveTime、workQueue、threadFactory和handler等参数的适用场景与选择原则,针对CPU密集型和IO密集型任务给出了具体配置建议。文章强调应避免使用无界队列,推荐采用有界队列配合合理的拒绝策略,并提供了典型场景的参数配置表和一个完整的线程池构建示例。最后通过流程图总结了线程池的任务处理逻辑,帮助开发者构建高效稳定的线程原创 2025-07-01 16:27:40 · 1125 阅读 · 0 评论 -
Spring 中 Bean 的生命周期
Spring Bean生命周期是指Bean从创建到销毁的完整过程,主要包括实例化、属性注入、初始化前处理、初始化、初始化后处理、就绪可用和销毁阶段。关键流程包括:通过构造器实例化、依赖注入属性、Aware接口回调感知容器信息、BeanPostProcessor扩展点处理初始化前后的逻辑(如AOP代理)、@PostConstruct或InitializingBean执行初始化逻辑,以及容器关闭时通过@PreDestroy或DisposableBean释放资源。生命周期钩子允许开发者在各阶段插入自定义逻辑,实现原创 2025-06-30 19:04:28 · 741 阅读 · 0 评论 -
JVM 垃圾回收(GC)笔记
Java垃圾回收机制解析:从原理到实践 本文系统介绍了Java垃圾回收机制的核心知识点。主要内容包括:垃圾回收的必要性(防止内存泄漏)、JVM内存区域划分(堆、栈、方法区等)、对象回收判定算法(引用计数和可达性分析)、不同内存区域的回收策略(新生代采用复制算法,老年代使用标记清除/压缩算法)。文章详细解析了常见垃圾收集器(如Serial、G1、ZGC)的特点及适用场景,并提供了GC日志分析和内存问题排查的实用工具。最后还介绍了三色标记法在并发GC中的应用原理及解决"漏标"问题的技术方案。原创 2025-06-30 16:35:41 · 1246 阅读 · 0 评论 -
Spring 中事务详解
Spring事务管理提供了编程式、XML配置式和注解式三种实现方式,其中注解式(@Transactional)最为常用。事务传播行为定义了7种方法调用时的处理策略,如REQUIRED(默认)、REQUIRES_NEW(独立事务)和NESTED(嵌套事务)。常见事务失效原因包括内部调用、非public方法、异常未抛出等。Spring支持5种隔离级别,默认使用数据库设置,并自动适配不同数据源的事务管理器。开发者应根据业务需求选择适当的事务策略,并注意AOP实现的限制条件。事务管理的关键在于平衡隔离性与性能,同时原创 2025-06-30 15:41:28 · 1004 阅读 · 0 评论 -
ThreadLocal 原理详细解析
摘要: ThreadLocal是Java中实现线程隔离的类,每个线程可独立存取变量副本,避免共享资源冲突。其核心通过ThreadLocalMap实现,每个线程存储独立的键值对(ThreadLocal对象为键,变量副本为值)。典型应用包括数据库连接池、会话管理及日志处理,能提升并发效率。但需注意内存泄漏风险,建议使用后调用remove()清理。适用于无共享需求的高并发场景,但不替代常规同步机制。原创 2025-06-28 16:41:18 · 800 阅读 · 0 评论 -
Synchronized笔记
Synchronized 锁原理与粒度分析 锁原理 synchronized是Java实现线程同步的关键字,通过监视器锁(Monitor)机制确保线程安全。早期版本因依赖操作系统Mutex Lock导致性能较低,涉及用户态与内核态切换开销。底层实现基于monitorenter和monitorexit指令,每个对象头包含指向Monitor的指针,通过计数器控制锁获取与释放。 锁粒度 分为对象锁和类锁两种: 对象锁:锁定特定实例,不同实例互不干扰 实现方式:同步代码块(synchronized(this))或同原创 2025-06-28 16:35:55 · 989 阅读 · 0 评论 -
Java 设计模式
本文总结了Java三种常用设计模式:单例模式确保全局唯一实例,实现方式包括懒汉式、饿汉式;工厂模式(简单工厂、工厂方法、抽象工厂)封装对象创建过程,解耦使用与创建;策略模式定义可互换算法,替代多分支条件。每种模式都包含定义、实现代码、适用场景和优缺点分析,适用于支付方式、资源池管理等实际开发场景,帮助开发者构建灵活、可维护的系统架构。原创 2025-06-27 17:33:29 · 1001 阅读 · 0 评论 -
Maven 笔记——生命周期、阶段与核心字段
Maven是Apache提供的Java项目构建与依赖管理工具,核心功能包括标准化构建流程(clean/default/site三大生命周期)、POM项目模型和自动化依赖管理。其中default生命周期包含编译(compile)、测试(test)、打包(package)等关键阶段,执行时会自动触发前置阶段。通过pom.xml文件定义项目坐标(groupId/artifactId/version)和打包方式(jar/war),常用命令如mvn compile、mvn package实现不同构建目标。标准项目结构原创 2025-06-27 16:59:28 · 305 阅读 · 0 评论 -
Spring 笔记——配置方式汇总
本文介绍了Spring框架的四种配置方式:XML配置、注解配置、Java配置类和Spring Boot自动配置。XML配置适用于传统项目,注解和Java配置更灵活现代,而Spring Boot提供了最简化的自动配置方案。文章对比了各方式的优缺点,推荐初学者从XML入手理解原理,实际开发中优先使用Java配置或Spring Boot。核心要点包括@ComponentScan注解、@Bean定义以及Spring Boot的"约定优于配置"理念,这些技术组合使用可以满足不同场景的开发需求。原创 2025-06-26 12:36:26 · 445 阅读 · 0 评论