自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 Java类加载机制

类加载机制(Class Loading Mechanism)是指JVM将.class文件中的二进制数据读取到内存中,对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型的过程。延迟加载:类只有在需要时才会被加载,而非程序启动时一次性加载所有类,节省内存开销隔离性:不同类加载器加载的类在JVM中属于不同命名空间,为容器化部署提供基础安全性:加载过程中的校验步骤可以防止恶意字节码进入JVMJava源码(.java)→编译→字节码(.class)→类加载→JVM执行。

2025-09-23 09:30:00 859

原创 Java线程池的状态

在并发编程中,线程池是提高性能和资源利用率的核心组件。它通过复用线程、控制并发数量来避免频繁创建销毁线程的开销。本文将从源码角度,带你一步步揭开线程池的神秘面纱。

2025-09-22 19:45:00 804

原创 理解程序、进程与线程

程序是一组静态的指令和数据的集合,存储在存储设备(如硬盘)中。它本身不执行任何操作,只是等待被加载到内存中运行。静态的:存储在磁盘上的文件被动的:不主动执行任何操作可执行文件:如 .exe、.jar、.py 文件等// 示例:一个简单的Java程序");进程是程序的一次执行实例,是操作系统进行资源分配和调度的基本单位。当程序被加载到内存并开始执行时,它就成为了一个进程。动态的:正在执行的程序实例独立的:拥有独立的地址空间和资源重量级:创建和销毁开销较大。

2025-09-22 09:00:00 741

原创 深入理解 HashMap的数据结构

HashMap 是基于哈希表的 Map 接口实现,它存储键值对(key-value pairs),允许 null 键和 null 值,并且不保证元素的顺序。// 基本使用示例// 输出: 25// 自定义键类必须正确实现 hashCode() 和 equals()@Override@Override// 使用自定义对象作为键在时间和空间成本上做了折衷,0.75 提供了较好的性能平衡。数据结构:数组 + 链表/红黑树(Java 8+)哈希函数:通过高位异或减少冲突。

2025-09-19 22:01:01 918

原创 ArrayList 与 LinkedList 的区别

特性ArrayListLinkedList底层结构动态数组双向链表随机访问⭐⭐⭐⭐⭐ 极快⭐ 极慢头部插入⭐ 慢⭐⭐⭐⭐⭐ 极快尾部插入⭐⭐⭐⭐ 快⭐⭐⭐⭐ 快中间插入⭐⭐ 较慢⭐⭐⭐ 较快内存占用较少(连续内存)较多(指针开销)扩容机制需要扩容(1.5倍)无需扩容遍历性能所有方式都快只能用迭代器适用场景查询多、增删少增删多、查询少。

2025-09-17 09:00:00 1040

原创 深入理解 Java 集合框架

接口:定义集合的基本操作实现:接口的具体实现类算法:对集合进行操作的方法(如排序、搜索)

2025-09-15 21:38:43 703

原创 Java 枚举(Enum)

类型安全:编译时检查,避免非法值可读性强:有意义的名称代替魔法数字功能丰富:可以拥有字段、方法、实现接口线程安全:枚举实例天生是线程安全的序列化安全:内置的序列化机制保证安全单例支持:是实现单例模式的最佳方式枚举是 Java 语言中一个强大而灵活的特性,正确使用枚举可以大大提高代码的质量和可维护性。

2025-09-15 08:45:00 3791

原创 深入理解 Java 异常处理机制

/ 受检异常@Override// 非受检异常= null?了解异常体系:Error vs Exception,受检异常 vs 非受检异常正确使用处理机制合理抛出异常:使用 throw 和 throws创建有意义的异常:自定义异常类,提供有用的错误信息遵循最佳实践:不要忽略异常,使用异常链,适当记录日志。

2025-09-14 22:45:00 567

原创 抽象类与接口的区别

Java中抽象类与接口的关键区别:抽象类用于建立"is-a"关系,支持代码复用,可包含具体方法和抽象方法,但只支持单继承;接口定义"has-a"契约,从Java8开始支持默认和静态方法,允许多实现。抽象类适合模板方法模式和共享代码场景,接口更适合定义行为契约和多态。实际开发中应优先考虑接口以提高灵活性,当需要共享代码基础时再使用抽象类。两者可通过组合使用(抽象类实现接口)来发挥各自优势。

2025-09-14 10:45:00 1163

原创 String、StringBuffer 和 StringBuilder 的区别

特性String可变性不可变可变可变线程安全是(天生线程安全)是(同步方法)否(非线程安全)性能最低(频繁创建新对象)中等(有同步开销)最高(无同步开销)使用场景字符串常量、少量操作多线程环境下的字符串操作单线程环境下的字符串操作内存效率低(频繁操作时)高最高版本引入Java 1.0Java 1.0Java 5方面String核心特点不可变可变、线程安全可变、非线程安全性能排序最慢中等最快线程安全是是否内存效率低(频繁操作时)高最高使用场景常量、少量操作。

2025-09-13 21:45:00 1498

原创 Java 中的 String 数据结构及其不可变性

String 的不可变性意味着一旦 String 对象被创建,它的值就不能被改变。任何看似修改 String 的操作实际上都是创建了一个新的 String 对象。// 输出: "Hello" - 原字符串未改变// 输出: "Hello World" - 新字符串。

2025-09-13 09:30:00 521

原创 Java I/O 模型:BIO、NIO 和 AIO

I/O(Input/Output)指的是计算机与外部世界(网络、磁盘、设备等)进行数据交换的过程。在网络编程中,I/O 主要涉及数据的读取和写入操作。BIO简单但性能有限,适合低并发场景NIO复杂但高性能,是现代网络应用的主流选择AIO理论上性能最好,但实际支持和编程复杂度限制了应用理解这三种 I/O 模型的区别和适用场景,对于设计高性能的 Java 网络应用至关重要。

2025-09-12 17:48:04 1031

原创 深入理解Java面向对象编程的三大特征

封装是将数据(属性)和行为(方法)捆绑在一起的过程,同时对外部隐藏对象的内部实现细节。通过访问修饰符来控制对类成员的访问级别。继承允许一个新类(子类)基于现有类(父类)来构建,获得父类的属性和方法,并可以添加新的功能或重写现有功能。多态是指同一个行为具有多个不同表现形式或形态的能力。编译时多态:方法重载运行时多态:方法重写封装:保护数据,提供清晰的接口继承:实现代码复用,建立层次关系多态:提高灵活性,支持扩展掌握这三大特征,能够帮助我们设计出更加健壮、可维护、可扩展的软件系统。

2025-09-12 09:30:00 1065

原创 Java中方法重写与重载的区别

方法重载是指在同一个类中,允许存在多个同名方法,但这些方法的参数列表必须不同(参数类型、参数个数或参数顺序不同)。方法重写是指子类重新定义父类中已有的方法,提供特定的实现。重写的方法必须与父类方法有相同的方法签名和返回类型(或是其子类)。重载是编译时多态,通过不同的参数列表提供方法的不同版本重写是运行时多态,通过子类定制父类行为来实现真正的多态理解它们的区别对于编写良好的面向对象代码至关重要。重载同类不同参,重写异类同参不同实现。

2025-09-11 22:30:00 668

原创 Java中==、equals() 的区别和 hashCode() 的关系

特性==equals()hashCode()用途比较基本类型值或对象引用比较对象内容生成对象的哈希码比较对象基本类型和引用类型只能是对象只能是对象默认行为比较值或引用比较引用(与==相同)基于对象地址可重写否是是与集合的关系无关用于contains()等操作用于哈希集合的存储和查找==比较值或引用,equals()比较内容,hashCode()生成哈希码重写equals()时必须重写hashCode()相等的对象必须有相同的哈希码。

2025-09-11 09:15:00 939

原创 深入理解Java中的位运算

位运算作为直接操作二进制的底层运算方式,在Java中虽然不常使用,但掌握它能让我们:理解框架和JDK源码中复杂的位操作逻辑(如HashMap中的哈希计算)等学习位运算的关键在于理解二进制的操作逻辑,多结合实际场景练习。

2025-09-10 21:45:00 620

原创 理解Java的基本数据与引用数据的差异和浮点数精度丢失问题

Java的基本数据类型和引用数据类型,本质是内存存储方式的差异——前者是栈中直接存值,后者是栈存地址、堆存对象;而浮点数精度丢失,则是二进制存储与十进制小数转换的固有矛盾。希望这篇文章能让你对Java数据类型有更深入的理解~

2025-09-10 09:00:00 839

原创 Java 数据类型详解

Java 是一种强类型语言,这意味着每个变量和表达式都有明确的类型,并且在编译时就会进行类型检查。了解 Java 的数据类型系统是掌握这门语言的基础。

2025-09-09 20:04:21 964

原创 布隆过滤器

布隆过滤器(Bloom Filter)是1970年由伯顿·霍华德·布隆(Burton Howard Bloom)提出的一种空间高效的概率型数据结构。它本身是一个很长的二进制向量(可以想象成一个很长的数组,里面只有0和1)和一系列随机映射函数。高效:插入和查询操作都非常快,时间复杂度是 O(k),k 是哈希函数的个数。省空间:不需要存储元素本身,只用一个个比特位,极大地节省了存储空间。概率性:它告诉你一个元素“可能存在”或“一定不存在注意这个“可能”和“一定”,这是理解布隆过滤器的关键。

2025-09-02 21:24:31 983

原创 Redis的删除策略:内存满了,谁先走?

策略类型工作时机目标特点定期删除定期随机检查清理过期Key减少CPU压力,但清理不彻底惰性删除访问Key时清理过期Key节省CPU,但可能积累垃圾数据内存淘汰内存不足时腾出内存空间决定数据去留的最终法则,需主动配置理解并合理配置这些策略,通常,配置好maxmemory和,就为你的Redis服务上了一道重要的保险。

2025-09-02 19:49:15 461

原创 Redis持久化:RDB与AOF,五分钟快速掌握

单纯做缓存,可以不用任何持久化。如果既要求速度又要求安全?优先使用混合持久化。如果最关心数据安全,能容忍性能一点点下降?使用AOF并配置每秒同步如果追求最快恢复速度,能容忍分钟级数据丢失?使用RDB。

2025-09-01 23:30:00 562

原创 Redis缓存三兄弟:穿透、击穿、雪崩

问题原因关键解决思路缓存穿透查询不存在的数据1. 缓存空对象 2. 布隆过滤器缓存击穿单个热点key过期,并发高1. 永不过期(逻辑过期) 2. 互斥锁缓存雪崩大量key同时过期或缓存宕机1. 错开过期时间 2. 高可用集群理解这三者的区别并采取正确的应对策略,是构建高并发、高可用系统的必备技能。希望这篇博客能帮你理清思路!

2025-09-01 14:38:11 1088

原创 线程安全的单例模式

静态内部类Holder不会随外部类Singleton的加载而加载只有当调用getInstance()方法时,才会触发Holder类的加载这种延迟初始化的特性实现了真正的按需加载(懒加载)JVM的类加载过程是线程安全的,当一个类被加载时,JVM会获取一个锁,确保在多线程环境下只有一个线程能加载这个类。单例模式是最常用的设计模式之一,在多线程环境下需要特别注意线程安全问题。是指延迟对象的创建,直到真正需要使用时才进行初始化。的初始化发生在类加载期间,由JVM保证线程安全。类只有在被主动引用时才会被加载,而。

2025-08-26 17:48:43 681

原创 JVM工具箱大全:深入掌握Java性能调优与故障排查利器

作为Java开发者,我们是否曾遇到过这些场景:应用突然变慢、内存溢出、CPU飙高,或者 simply想知道JVM内部发生了什么?工欲善其事,必先利其器。本文将全面总结JVM生态中的各种工具,从内置命令行工具到强大的图形化界面,帮助你成为JVM调优和故障排查的高手。掌握JVM工具集是每一个Java开发者必备的技能。从基础的命令行工具到高级的图形化界面,从实时监控到事后分析,每种工具都有其特定的适用场景。希望通过本文的总结,能够帮助你在遇到JVM相关问题时,能够快速选择正确的工具,高效地定位和解决问题。

2025-08-26 09:00:00 1017

原创 深入理解JVM垃圾收集器:垃圾收集器

作为Java开发者,我们几乎每天都在与JVM打交道,但你是否真正了解JVM是如何自动管理内存、回收垃圾对象的?本文将带你深入探讨JVM垃圾收集器的核心知识,帮助你编写出更高效、更稳定的Java应用。

2025-08-25 19:31:48 789

原创 Java的运行时数据区

运行时数据区是JVM内存管理的核心,不同区域的设计体现了Java对线程隔离、内存复用、自动回收等特性的支持。

2025-08-21 23:30:00 805

原创 Java类加载机制

只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。双亲委派模型不是强制约束,而是Java设计者推荐给开发者的一种类加载器实现方式。每一层的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的。当一个类加载器需要加载某个类时,它首先不会自己尝试加载,而是把这个请求。,因为它是整个类加载机制的基石和灵魂。在深入细节之前,必须首先理解。

2025-08-21 18:57:08 540

原创 JVM基础知识总结

内存管理:理解堆、栈、方法区的作用和区别是基石。垃圾回收:理解分代收集思想和可达性分析原理是关键。类加载:理解双亲委派模型(未在本文展开,但极其重要)和类加载的五个阶段是理解 Java 动态性的基础。

2025-08-20 20:36:28 1364

原创 Java的反射机制

核心概念:反射是指在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取信息以及动态调用对象方法的功能称为反射机制。简单比喻.class文件是类的“设计图纸”。正常情况下,我们根据图纸(通过new关键字)创建和使用对象。而反射就像是一面“镜子”,允许程序在运行时拿到这张图纸,并且可以仔细端详图纸的每一个细节(构造方法、成员变量、方法等),甚至可以根据图纸临时创建一个对象或调用方法。与正射的区别正射:在编译时就知道要操作的是哪个类。反射。

2025-08-20 15:07:48 700

原创 深入理解AQS:并发编程的基石

AQS(AbstractQueuedSynchronizer,抽象队列同步器)是Java并发包(JUC)的核心基础框架,它为实现各种同步器(如锁、信号量等)提供了一个通用的底层架构。模板方法模式:分离通用逻辑与特定实现CLH队列变体:高效管理等待线程状态机设计:灵活支持多种同步器无锁算法:CAS操作保证线程安全。

2025-08-19 20:04:14 304

原创 深入理解 CAS:无锁编程的核心基石

CAS 是一种原子操作内存位置(V):需要修改的共享变量在内存中的地址预期原值(A):线程在操作前读取到的变量值新值(B):线程想要将变量修改为的值CAS 操作的执行逻辑非常简单:当且仅当内存位置 V 中的值等于预期原值 A 时,才会将该位置的值更新为新值 B;否则不做任何操作。整个过程是原子的,不会被其他线程中断。// 操作成功// 操作失败CAS 作为一种无锁同步机制,通过硬件提供的原子操作指令,在保证并发安全性的同时,避免了传统锁机制带来的性能开销。

2025-08-19 16:18:03 2654

原创 关于Java中线程间的局部变量ThreadLocal

ThreadLocal 的正确使用可以显著简化多线程程序设计,但必须注意内存管理问题。理解其实现原理还是有必要的。

2025-08-18 21:00:00 464

原创 Java的线程池

/ 记录日志// 降级处理if (!避免使用Executors工具类创建线程池(可能导致OOM,如FixedThreadPool的无界队列),建议手动创建ThreadPoolExecutor并指定参数。根据任务类型(CPU密集型/IO密集型)合理设置核心线程数和最大线程数注意任务队列的选择,避免无界队列导致内存溢出。线程池需要手动关闭(调用shutdown()或shutdownNow()),否则可能导致程序无法退出。

2025-08-18 09:00:00 1215

原创 JUC并发集合

JUC并发集合通过锁优化无锁算法(CAS)、写时复制等机制,在保证线程安全的同时兼顾性能,解决了传统集合在多线程下的和数据不一致问题。实际开发中,是最常用的并发集合。

2025-08-17 21:45:00 848

原创 ReentrantLock与synchronized区别

的优势:语法简单、自动释放锁、不易出错、JVM优化成熟,适合大多数基础同步场景。的优势:功能更灵活(公平锁、中断、超时、多条件),适合复杂同步场景,需手动管理锁释放(注意finally块)。

2025-08-17 08:00:00 684

原创 ReentrantLock可重入锁

是 Java 并发包 () 中提供的一种可重入互斥锁,它提供了比关键字更灵活、更强大的锁机制。提供了比需要尝试获取锁或超时机制需要可中断的锁获取需要公平锁机制需要多个条件变量需要跨方法加锁解锁在大多数情况下,如果不需要 ReentrantLock 的高级特性,使用是更简单和安全的选择。但当需要更灵活的锁控制时,ReentrantLock 是强大的工具。

2025-08-16 12:54:50 377

原创 synchronized的实现原理

基于对象头的 Mark Word 存储锁状态,通过锁升级机制(无锁→偏向锁→轻量级锁→重量级锁)平衡性能与安全性,底层依赖监视器(Monitor)和 CAS 操作。Java 6 后的优化(如偏向锁、轻量级锁、自适应自旋)大幅提升了的性能,使其在多数场景下与包中的锁机制相差无几,成为简单且高效的同步方案。

2025-08-13 23:00:00 729

原创 synchronized的作用

是 Java 并发编程的基础,通过"对象锁"机制保证了原子性、可见性和有序性。其底层实现经历了从重量级锁到偏向锁、轻量级锁的优化,理解的工作原理。下一篇会详细介绍的实现原理,这里简单的了解一下的理解以及作用。

2025-08-13 13:27:39 1020

原创 Java中线程的实现方式

优先使用线程池(ExecutorService),避免直接创建Thread对象。一般在开发中都会使用自定义线程池的方式创建线程。(一) FutureTask实现。(二) ForkJoinPool。弹性线程池,自动回收,缓存。通过Executor框架。支持定时/周期性任务。实现Runnable。实现Callable。

2025-08-12 21:41:21 718

原创 JAVA线程中的状态

Java线程在其生命周期中会经历不同的状态,理解这些状态及其转换条件对于多线程编程和问题排查至关重要。Java定义了6种线程状态,通过枚举表示。

2025-08-12 12:01:45 722

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除