Java
文章平均质量分 94
Java 已经发展为世界上最流行和最受欢迎的编程语言之一,每年有超过数以万计的人在学习 Java 或从事 Java 开发相关的工作。毋庸置疑,Java 技术已经深入各行各业。
流华追梦
15年+ IT从业经验,互联网高级算法工程师、Java语言专家、.Net专家、博客专家、阿里云专家、CSDN2023博客之星,CSDN付费资源项目实践专家,谢谢关注!
展开
-
只要5分钟,从根上搞懂 Java 之 StringBuffer 和 StringBuilder
在 Java 中,我们除了可以通过 String 类创建和处理字符串之外,还可以使用 StringBuffer 和StringBuilder 类来处理字符串。其中,String 类定义的字符串内容不可变,所以,String 属于不可变字符串。而 StringBuffer 和 StringBuilder 定义的字符串内容可变,这两者属于可变字符串,并且StringBuffer 和 StringBuilder,对字符串的处理效率比 String 类更高。原创 2024-03-22 07:30:00 · 928 阅读 · 0 评论 -
(二)Spring 核心之面向切面编程(AOP)—— 切面的实现
在《(二)Spring 核心之控制反转(IoC)—— 体系结构设计及原理详解》中,我们分析了 Spring IoC 的初始化过程和 Bean 的生命周期等,而 Spring AOP 也是基于 IoC 的 Bean 加载来实现的。本文主要介绍 Spring AOP 原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应 Advice,并将 Advice 连同切入点匹配器和切面类等信息一并封装到 Advisor,为后续交给代理增强实现做准备的过程)。原创 2024-02-19 07:30:00 · 1717 阅读 · 0 评论 -
10分钟帮你重新梳理 Java 异常 —— Throwable、Error、Exception
程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。在 Java 中,即 Java 在编译、运行或者运行过程中出现的错误。异常发生时,是任程序自生自灭,立刻退出终止,还是预判性的对其进行捕获处理,显然后者更具保障。异常处理机制能让程序在异常发生时,按照代码预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。原创 2024-02-15 07:30:00 · 2360 阅读 · 0 评论 -
Java 日志体系泣血总结
本文的目的是搞清楚 Java 中各种日志 Log 之间是怎样的关系,如何作用、依赖,好让我们平时在工作中如果遇到“日志打不出”或者“日志 jar 包冲突”等之类的问题知道该如何入手解决,以及在各种场景下如何调整项目中的各个框架的日志输出,使得输出统一。slf4j 的日志加载会在程序启动时把日志打出来,所以一定要注意,它会说明加载是否成功,加载了那个日志实现。slf4j 已经对错误作了说明,下面讲一下可能经常遇到的问题。原创 2024-01-16 08:00:00 · 934 阅读 · 1 评论 -
Java 对象的内存布局
作为一名 Java 程序员,我们在日常工作中使用这门面向对象的编程语言时,做的最频繁的操作大概就是去创建一个个的对象了。对象的创建方式有很多,可以通过 new、Spring 管理 Bean、反射、clone、反序列化等不同方式来创建,但最终使用时对象都要被放到内存中,那么你知道在内存中的 Java 对象是由哪些部分组成以及是怎么存储的吗?这篇文章可带你深入了解 Java 对象的内存布局。原创 2024-01-11 08:00:00 · 1137 阅读 · 1 评论 -
Java 之 CAS(CompareAndSwap)底层原理详解
CAS 的全称是 Compare-And-Swap,它是 CPU 并发原语。它的功能是判断内存某个位置的值是否为预期值。如果是则更改为新的值,这个过程是原子的。CAS 并发原语体现在 Java 语言中就是 sun.misc.Unsafe 类的各个方法。调用 UnSafe 类中的 CAS 方法,JVM 会帮我们实现出 CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于 CAS 是一种系统原语,原语属于操作系统作用范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的原创 2024-01-08 09:01:19 · 426 阅读 · 0 评论 -
Netty 权威指南,万字长文带你深入理解 Netty
Netty 是一款卓越的 Java框架,提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。它用较简单的抽象,隐藏 Java 网络编程底层实现的复杂性而提供一个易于使用的 API 的客户端/服务器框架。原创 2024-01-03 08:53:35 · 1182 阅读 · 2 评论 -
Java 之 Queue 家族
队列是一种特殊的线性表,遵循的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是java的某些队列允许在任何地方插入删除;比如我们常用的 LinkedList 集合,它实现了Queue 接口,因此,我们可以理解为 LinkedList 就是一个队列。原创 2023-07-04 15:14:02 · 141 阅读 · 0 评论 -
Java 泛型机型详解
Java 泛型这个特性是从 JDK 1.5 才开始加入的,因此为了兼容之前的版本,Java 泛型的实现采取了“伪泛型”的策略,即 Java 在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。原创 2023-12-20 09:04:34 · 773 阅读 · 1 评论 -
Java 内存模型(JMM)探寻原理,深度讲解
网上有很多关于 Java 内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚至有的人说自己更懵了。本文,就来整体的介绍一下 Java 内存模型,目的很简单,让你读完本文以后,就知道到底Java 内存模型是什么,为什么要有 Java 内存模型,Java 内存模型解决了什么问题等。原创 2023-12-18 09:12:14 · 1565 阅读 · 2 评论 -
Java IO 模型之 BIO、NIO、AIO 详解
在 Java 编程中,IO(Input/Output)操作是非常常见的操作,它涉及到文件读写、网络通信等方面。Java 提供了各种类来支持这些操作。本文将从 IO 的基础知识讲起,逐步深入,介绍 Java IO 的各个方面。Java IO(Input/Output)是 Java 语言中用于读写数据的 API,它提供了一系列类和接口,用于读取和写入各种类型的数据。原创 2023-12-15 09:31:01 · 1315 阅读 · 0 评论 -
Java 内部类详解
在 Java 中,我们通常是把不同的类创建在不同的包里面,对于同一个包里的类来说,它们都是同一层次的。但其实还有另一种情况,有些类可以被定义在另一个类的内部,我们把在一个类里面定义的类称为内部类(InnerClass)或嵌套类,把外面定义的类称为外部类(OutClass)或宿主类。也就是说,在类的内部既可以定义成员变量和方法,也可以定义其他的类。public class Outer { // 外部类class Inner { // 内部类// 方法和属性。原创 2023-12-12 09:04:45 · 824 阅读 · 0 评论 -
JVM 内存分析工具 Memory Analyzer Tool(MAT)的深度讲解
Memory Analyzer Tool(简称:MAT),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具。其通过展现 JVM 异常时所记录的运行时堆转储快照(Heap dump)状态(正常运行时也可以做堆转储分析),帮助定位内存泄漏问题或优化大内存消耗逻辑。MAT 的产品能力非常丰富,工作原理是对 dump 文件建立多种索引,并基于索引来实现:1. 内存分布;2. 对象间依赖(如实体对象引用关系、线程引用关系、ClassLoader引用关系等);3. 对象状态(内存占用量、字段属性值等);原创 2023-12-10 09:56:51 · 3066 阅读 · 0 评论 -
JVM 性能调优及监控诊断工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解
关于 Java 中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露。对象都是有生命周期的,有的长,有的短,如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。是否有开源的内存泄露静态分析工具呢?但遗憾的是经调查几个知名的静态代码分析工具findbugs 、SonarQube、Checkstyle 等都不能实现内存泄露检测,只能对编码规范和部分潜在的bug 提前报告,相信将来会有更好的检测手段对内存泄露防范于未然。原创 2023-12-09 09:55:08 · 1324 阅读 · 0 评论 -
探秘 JAVA 诞生之路,引领编程人生的宏伟著作
Java 是一门面向对象的编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。原创 2023-12-08 10:52:53 · 948 阅读 · 0 评论 -
Java8 之 Optional 详解
关于使用Optional的误区有以下:1. 正确的使用创建方法,不确定是否为 null 时尽量选择 ofNullable 方法;2. 通过源代码会发现,它并没有实现 java.io.Serializable 接口,因此应避免在类属性中使用,防止意想不到的问题;3. 避免直接调用 Optional 对象的 get() 和 isPresent() 方法,尽量多使用 map()、filter()、orElse()等方法来发挥 Optional 的作用。原创 2023-11-29 11:40:48 · 2074 阅读 · 0 评论 -
Java 之 lambda 表达式(二)---- Stream 操作 API
Stream,就是 JDK8 依托于函数式编程特性为集合类库做的一个类库,它其实就是 JDK 提供的函数式接口的最佳实践。它能让我们通过 lambda 表达式更简明扼要的以流水线的方式去处理集合内的数据,可以很轻松的完成诸如:过滤、分组、收集、归约这类操作。Stream 特点:1. Stream 自己不会存储元素;2. Stream 不会改变源对象,Stream 操作会返回一个新的Stream;3. Stream 操作是延迟执行的,这意味着等到获取结果时,Stream 才会执行。原创 2023-11-28 13:37:36 · 997 阅读 · 0 评论 -
Java 之 lambda 表达式(一)
咱们首先来说说 lambda 这个名字,lambda 并不是一个什么的缩写,它是希腊第十一个字母 λ 的读音,同时它也是微积分函数中的一个概念,所表达的意思是一个函数入参和出参定义,在编程语言中其实是借用了数学中的 λ原创 2023-11-27 14:15:08 · 868 阅读 · 0 评论 -
Java 之 final 详解
在Java中,final 表示“最终的、不可改变的、完结的”,它也是一种修饰符,可以修饰变量、方法和类。final 修饰变量、方法和类时的意义是不同的,但本质是一样的,都表示不可改变,类似 C#里的 sealed 关键字。final 修饰的变量叫做最终变量,也就是常量,修饰的方法叫做最终方法,修饰的类叫做最终类。原创 2023-11-24 15:01:03 · 6696 阅读 · 2 评论 -
Java 之 volatile 详解
volatile 可以看做是轻量级的 synchronized,它只保证了共享变量的可见性,是Java虚拟机提供的轻量级的同步机制。在线程 A 修改被 volatile 修饰的共享变量之后,线程 B 能够读取到正确的值。Java 在多线程中操作共享变量的过程中,会存在指令重排序与共享变量工作内存缓存的问题。volatile 一共有三大特性,保证可见性不保证原子性禁止指令重排。原创 2023-11-23 18:07:11 · 1203 阅读 · 1 评论 -
JVM 之 javac、java、javap 命令详解
在日常工作中,我们新建 Java工程,写好代码后,编译和运行几乎都是通过 IDE(如idea、eclipse)工具完成。但作为 Java开发者还是要了解下 Java虚拟机指令。通过 javac 和 java 执行编译 Java文件和运行class以及jar文件,通过 javap 命令查看编译后的Java字节码。原创 2023-11-23 11:19:22 · 1826 阅读 · 0 评论 -
JVM 之 字节码指令
字节码指令集的特点是数据量短小精干,便于传输,跨平台。同时也损失一定的解释执行效率。1. 由 操作码 + 操作数组成。JVM的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。2. 指令集的操作码是单字节的,总数不可能超过256条。为了尽可能获得短小精干的编译代码。3. 操作数的长度不对齐,长度超过1字节的以big一endian顺序存储,即高位在前的字节序。原创 2023-11-22 14:31:53 · 608 阅读 · 0 评论 -
JVM 之 class文件详解
我们平时在DOS界面中往往需要先运行 javac 命令,这个命令的直接结果就是产生相应的class文件,然后基于这个class文件才可以真正运行程序得到结果。当然,这是Java虚拟机的功劳,那么是不是Java虚拟机只能编译 .java 的源文件呢?答案是否定的。时至今日,Java虚拟机已经实现了语言无关性的特点。而实现语言无关性的基础是虚拟机和字节码的存储格式,Java虚拟机已经不和包括Java语言在内的任何语言绑定。它只与“class”文件这种特定的二进制文件相关联。原创 2023-11-22 10:41:18 · 523 阅读 · 0 评论 -
深入理解 synchronized 原理
synchronized 是JDK为解决同步问题设计的一种锁,synchronized 保证被其修饰的方法或者代码块在任何时候都只能有一个线程访问。但在JDK1.5之前它的效率十分低下,属于重量级的锁。在JDK1.5后对synchronized 在JVM层面进行了优化,即在JVM层面就将锁的功能实现,而不是依赖操作系统去实现,这里就省去了操作系统内核态和用户态的频繁切换,引入了自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。原创 2023-11-20 18:32:50 · 184 阅读 · 3 评论 -
Java 中的全部锁
本文Java中常用的锁以及常见的锁的概念进行了基本介绍,并从源码以及实际应用的角度进行了对比分析。限于篇幅,没有在本篇文章中对所有内容进行深层次的讲解。其实Java本身已经对锁本身进行了良好的封装,降低了开发同学在平时工作中的使用难度。但是开发同学也需要熟悉锁的底层原理,不同场景下选择最适合的锁。而且源码中的思路都是非常好的思路,也是值得大家去学习和借鉴的。原创 2023-11-17 16:07:11 · 143 阅读 · 3 评论 -
Maven 之 pom.xml 文件详解
POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,XML格式,名称为 pom.xml,作用类似 ant 的 build.xml 文件,功能则更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。事实上,在Maven的世界中,一个项目可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。关于Maven的详细介绍请参见《Maven 从入门到精通》。原创 2023-11-16 10:52:13 · 1634 阅读 · 2 评论 -
Maven 之 settings.xml文件详解
Maven是一个流行的Java项目构建工具,它使用pom.xml文件来定义项目的配置和依赖关系。然而,Maven还提供了另一个重要的文件——setting.xml文件,用于配置Maven本身的行为。在本文中,我们将深入介绍setting.xml文件的作用和常见的配置选项。关于Maven的详细介绍请参见《Maven 从入门到精通》。原创 2023-11-15 16:34:47 · 936 阅读 · 1 评论 -
CopyOnWriteArrayList 源码详解
CopyOnWriteArrayList 是 ArrayList 的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。原创 2023-11-15 09:56:00 · 83 阅读 · 3 评论 -
JDK 环境变量设置
JDK环境变量,简单来说,就是告诉电脑在哪里可以找到你的Java开发工具。在编写Java程序时,你需要在命令行或者集成开发环境(IDE)中使用命令来编译和运行它。如果你没有正确地配置JDK环境变量,你的操作系统就无法找到这些命令,因此无法编译和运行Java程序。原创 2023-11-14 10:57:47 · 618 阅读 · 3 评论 -
Maven 从入门到精通
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。读音是['meɪv(ə)n]或['meɪvn]。原创 2023-11-09 15:03:13 · 641 阅读 · 5 评论 -
ConcurrentHashMap 源码解析
ConcurrentHashMap 是 HashMap 的线程安全版本,其内部和 HashMap 一样,都是采用了数组 + 链表 + 红黑树的方式来实现。如何实现线程的安全性?加锁。但是这个锁应该怎么加呢?原创 2023-11-08 14:11:11 · 546 阅读 · 0 评论 -
Java 反射机制详解
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。Java反射机制在框架设计中极为广泛,需要深入理解。本文综合多篇文章后,总结了Java 反射的相关知识,希望可以提升你对Java中反射的认知效率。最后,用几句话总结反射的实现原理:1、反射类及反射方法的获取,都是通过从列表中搜寻查找匹配的方法,所以查找性能会随类的大小方法多少而变化;原创 2023-10-27 18:00:48 · 246 阅读 · 1 评论 -
TreeMap 源码解析
TreeMap 按照 key 的顺序的 Map 实现类,底层采用红黑树来实现存储。TreeMap 因为采用树结构,所以无需初始考虑像 HashMap 考虑容量问题,也不存在扩容问题。TreeMap 的 key 不允许为空( null ),可能是因为红黑树是一颗二叉查找树,需要对 key 进行排序。相比 HashMap 来说,TreeMap 不仅仅支持指定 key 的查找,也支持 key 范围的查找。当然,这也得益于 TreeMap 数据结构能够提供的有序特性。原创 2023-10-27 10:36:35 · 122 阅读 · 0 评论 -
WeakHashMap 源码解析
WeakHashMap,从名字可以看出它是某种 Map。它的特殊之处在于 WeakHashMap 里的entry可能会被GC自动删除,即使程序员没有调用remove()或者clear()方法。更直观的说,当使用 WeakHashMap 时,即使没有显示的添加或删除任何元素,也可能发生如下情况:1. 调用两次size()方法返回不同的值;2. 两次调用isEmpty()方法,第一次返回false,第二次返回true;原创 2023-10-26 10:33:51 · 93 阅读 · 0 评论 -
Java 四种引用类型
Java 引用是用于访问对象或变量的标识符。在 Java 中,引用是一种数据类型,它可以指向对象或变量的内存地址。Java 中的引用有四种类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。强引用是最常用的引用类型,它指向一个对象,只要强引用存在,对象就不会被垃圾回收器回收。如果对象没有任何强引用指向它,垃圾回收器将在适当的时候回收该对象。原创 2023-10-25 15:53:20 · 332 阅读 · 0 评论 -
LinkedHashMap 源码解析
HashMap元素插入是无序的,为了让遍历顺序和插入顺序一致,我们可以使用LinkedHashMap,其内部维护了一个双向链表来存储元素顺序,并且可以通过 accessOrder 属性控制遍历顺序为插入顺序或者访问顺序。本文将记录LinkedHashMap的内部实现原理,基于JDK1.8,并且用LinkedHashMap实现一个简单的LRU。LinkedHashMap实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素。原创 2023-10-25 11:42:21 · 97 阅读 · 1 评论 -
HashMap 源码解析
HashMap基于的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。HashMap实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素;除该类未实现同步外,其余跟Hashtable大致相同;原创 2023-10-24 14:32:02 · 68 阅读 · 0 评论 -
PriorityQueue 源码解析(JDK1.8)
PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator,类似于C++的仿函数)。Java中PriorityQueue实现了Queue接口,不允许放入null元素;原创 2023-10-23 14:24:36 · 91 阅读 · 0 评论 -
ArrayDeque 源码解析(JDK1.8)
ArrayDeque 和LinkedList 是Deque的两个通用实现,由于官方更推荐使用ArrayDeque用作栈和队列,由于作者已经讲解过LinkedList,本文将着重讲解ArrayDeque的具体实现。双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列。ArrayDeque 是一种以数组方式实现的双端队列,它是非线程安全的。由其名字可以看出,其是一个由数组实现的双端队列,对比 LinkedList 是由链表实现的双端队列。原创 2023-10-20 17:33:15 · 145 阅读 · 0 评论 -
Java 之 Queue & Deque 介绍
Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。原创 2023-10-20 16:30:46 · 84 阅读 · 0 评论