
Java
文章平均质量分 90
Java
pan_junbiao
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM虚拟机:内存结构、垃圾回收、性能优化
Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM 的跨平台特性使得 Java 程序可以在任何支持 JVM 的操作系统上运行,实现了“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的目标。原创 2025-06-06 17:51:02 · 1035 阅读 · 0 评论 -
Java中的ConcurrentHashMap的使用与原理
ConcurrentHashMap 是 Java 中为高并发场景设计的线程安全哈希表实现,位于 java.util.concurrent 包。它解决了 Hashtable 和 Collections.synchronizedMap() 的锁粒度过大导致的性能问题,在保证线程安全的同时显著提升并发吞吐量。ConcurrentHashMap 是 Java 中线程安全的哈希表实现,其核心原理在于通过精细化锁机制(分段锁或 CAS + synchronized)实现高并发性能。原创 2025-05-31 18:50:39 · 892 阅读 · 0 评论 -
SpringBoot使用ThreadLocal保存登录用户信息
ThreadLocal 是 Java 中解决多线程数据隔离问题的工具,其核心功能是:每个线程拥有独立的变量副本,避免线程间共享数据导致的并发安全问题。java.lang.ThreadLocal 是自 JDK1.2 版本起提供的线程成员操作类,在多线程环境下开发工作中,经常需要区分不同的线程,而且在一个线程的执行过程中能够一直访问某一个数据,而 ThreadLocal 就是可以很好地解决这个问题。原创 2025-05-29 17:39:13 · 1188 阅读 · 4 评论 -
Java线程池
在 Java 语言中,可以通过 new Thread 的方法来创建一个新的线程执行任务,但是线程的创建是非常耗时的,而且创建出来新的线程都是各自运行的,缺乏统一的管理,这样做的后果是可能导致创建过多的线程从而过度消耗系统的资源,最终导致性能急剧下降,线程池的引入就是为了解决这些问题。线程池可以预先创建给定数量的线程,这些线程可以被复用从而极大节省了系统资源,当线程一段时间不再有任务处理时它也会自动销毁,而不会常驻内存中。原创 2025-05-24 16:30:43 · 934 阅读 · 0 评论 -
Java使用CollectionUtils集合工具类
CollectionUtils 是 Apache Commons Collections 库提供的集合操作工具类,主要用于简化 List、Set 等集合的常见操作。与 JDK 自带的 Collections 工具类不同,它提供了更多增强功能且能更好地处理 null 值。原创 2025-05-22 17:39:36 · 930 阅读 · 0 评论 -
Java使用Collections集合工具类
Java 中的 Collections 是一个非常有用的工具类,它提供了许多静态方法来操作或返回集合。这个类位于 java.util 包中,主要包含对集合进行操作的方法,比如排序、搜索、线程安全化等。Collections 类的方法都是静态的,使用时直接通过类名调用,如 Collections.max(list)。这些方法大大简化了集合操作,特别是对 List 的常见处理。原创 2025-05-22 17:08:12 · 1028 阅读 · 0 评论 -
Java阻塞队列(BlockingQueue)的使用:ArrayBlockingQueue类、LinkedBlockingQueue类
Java 中的阻塞队列(BlockingQueue) 是多线程编程中用于协调生产者和消费者线程的重要工具,属于 java.util.concurrent 包。它的核心特点是:当队列为空时,消费者线程会被阻塞,直到队列中有新元素;当队列满时,生产者线程会被阻塞,直到队列有空闲空间。这种机制简化了线程同步的复杂性。ArrayBlockingQueue 是 Java 中基于数组实现的有界阻塞队列,是基于数组实现的有界 BlockingQueue,该队列满足先入先出(FIFO)的特性。原创 2025-05-21 18:26:47 · 1241 阅读 · 0 评论 -
Java多线程的同步:synchronized关键字、Lock接口、volatile关键字
Java 多线程同步是解决资源共享冲突的核心机制,主要通过协调线程对共享资源的访问顺序与权限,避免数据不一致和竞态条件。在多线程的环境中,经常会碰到数据的共享问题,即当多线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某一时刻只能被一个线程使用,否则,程序的运行结果将会是不可预料的,在这种情况下就必须对数据进行同步。例如多个线程同时对同一数据进行写操作。原创 2025-05-16 10:54:46 · 842 阅读 · 0 评论 -
Java创建多线程的3种方法:继承Thread类、实现Runnable接口、实现Callable接口
线程(Thread)是程序的执行单元,一个进程内可包含多个线程。利用多核 CPU 并行执行任务(如并发计算、批量处理)。主线程不阻塞(如 GUI 界面后台加载数据)。共享进程资源(内存、文件句柄),减少上下文切换开销。Java 多线程通过并发执行提升程序效率,核心实现方式包括:Thread、Runnable 和 Callable,需注意线程安全问题(同步机制)。实际开发中优先使用线程池和并发工具类(如 JUC 包)简化编码并优化性能。原创 2025-05-11 10:39:31 · 672 阅读 · 0 评论 -
SpringBoot整合POI实现Excel文件的导出与导入
Apache POI 是一个基于 Java 的开源库,专为读写 Microsoft Office 格式文件(如 Excel、Word、PowerPoint、Visio 等)而设计,支持 Office 97-2016 版本的文件操作。其名称源于“Poor Obfuscation Implementation”(简洁版的模糊实现)的首字母缩写。Apache POI 功能全面,覆盖 Office 文件的全生命周期操作。社区活跃,文档丰富,适用于复杂场景(如:模板替换、动态生成报表)。原创 2025-04-15 20:06:07 · 1233 阅读 · 0 评论 -
Java中String、Array、List的相互转换工具类
在 Java 语言中将字符串作为对象来管理,因此可以像创建其他类对象一样来创建字符串对象。String 类是不可变(final)的,对 String 类的任何改变,都是返回一个新的 String类对象。数组是具有相同数据类型的一组数据的集合。数组中的每个元素具有相同的数据类型。在 Java 中同样将数组看作一个对象,虽然基本数据类型不是对象,但由基本数据类型组成的数组却是对象。在程序设计中引入数组可以更有效地管理和处理数据。可根据数组的维数将数组分为一维数组、二维数组等。原创 2025-04-06 20:39:47 · 695 阅读 · 0 评论 -
Java数组
数组是具有相同数据类型的一组数据的集合。例如,球类的集合——足球、篮球、羽毛球等;电器集合——电视机、洗衣机、电风扇等。在程序设计中,可以将这些集合称为数组。数组中的每个元素具有相同的数据类型。在 Java 中同样将数组看作一个对象,虽然基本数据类型不是对象,但由基本数据类型组成的数组却是对象。在程序设计中引入数组可以更有效地管理和处理数据。可根据数组的维数将数组分为一维数组、二维数组等。原创 2025-04-06 18:02:30 · 839 阅读 · 0 评论 -
Java中的String,StringBuilder,StringBuffer区别
本文详细解析了 Java中 String,StringBuilder 和 StringBuffer 的区别,主要从运行速度和线程安全两个方面进行了对比。String适用于少量字符串操作,StringBuilder适用于单线程大量操作,StringBuffer适合多线程大量操作。原创 2025-04-02 16:42:31 · 369 阅读 · 0 评论 -
Java中String字符串的常用方法
在 Java 语言中将字符串作为对象来管理,因此可以像创建其他类对象一样来创建字符串对象。String 类是不可变(final)的,对 String 类的任何改变,都是返回一个新的 String类对象。这样的话把 String 类的引用传递给一个方法,该方法对 String 的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似。Java 的 String 通过不可变性设计保障安全性与效率,但其操作需注意对象复用及性能优化。开发者应掌握常量池机制、常用方法及不可变特性,合理选择拼接策略以提升代原创 2025-04-02 16:18:46 · 316 阅读 · 0 评论 -
Jackson实现JSON数据的合并
Jackson 库实现 JSON 数据的合并,可以采用基于树模型的深度合并(递归策略),可以保留两个 JSON 的所有层级数据,避免覆盖冲突。在实际开发中,Jackson 功能丰富、安全可靠并且具有比较好的兼容性,这让程序开发人员可以很方便地实现 JavaBean 和以 “键 : 值” 结构保存的 JSON 数据的相互转换。原创 2025-03-24 19:53:27 · 493 阅读 · 0 评论 -
Jackson使用ArrayNode对象实现JSON列表数据(二):增、删、改、查
Jackson 库中的 ArrayNode 数组节点类是用于表示 JSON 数组的可变节点类,继承自 JsonNode,专为动态构建和操作 JSON 数组设计。支持动态添加、删除数组元素,与只读的 JsonNode 形成对比,可存储混合类型元素(如字符串、数值、嵌套对象或其他数组),常与 ObjectNode 配合构建复杂 JSON 结构。ArrayNode 数组节点类也是 JsonNode 中的一个常用子类,甚至 JsonNode 提供的个别方法就是专门为 ArrayNode 数组节点设计的。原创 2025-03-24 18:07:06 · 1173 阅读 · 0 评论 -
Jackson使用ObjectNode对象实现JSON对象数据(一):增、删、改、查
Jackson 库中的 ObjectNode 对象节点类是操作 JSON 对象的核心类,可实现动态的增删改查操作。ObjectNode 对象节点是 JsonNode 中比较常用的一个子类。如果以 “键 : 值” 结果保存的 JSON 数据中的某个节点也是一个以 “键 : 值” 结构保存的 JSON 数据,那么这个节点就用 ObjectNode 表示。原创 2025-03-23 17:11:20 · 1239 阅读 · 0 评论 -
Jackson的核心类与API方法:ObjectMapper、JsonNode、ObjectNode、ArrayNode
Jackson 不仅是一个基于 Java 语言的、开源的 JSON 解析库,也是 Spring Boot 默认使用的 JSON 解析库。为什么 Spring Boot 会默认使用 Jackson 呢?这是因为在 spring-boot-starter-web 依赖包中已经依赖了 Jackson 的依赖包(即:jackson-databind)。在实际开发中,Jackson 功能丰富、安全可靠并且具有比较好的兼容性。原创 2025-03-23 15:23:51 · 1122 阅读 · 0 评论 -
Java中迭代器(Iterator)的使用
在 Java 中,迭代器(Iterator)是集合框架中用于遍历集合元素的一种机制。它提供了一种统一的方式来访问集合中的元素,而不需要了解底层集合的具体实现细节。迭代器是一个对象,用于按顺序访问集合中的元素。它提供了访问集合元素的标准方法,而不必暴露集合的内部结构。迭代器位于 java.util 包中,是一个接口。迭代器简化了集合的遍历过程,使得代码更加简洁和易于维护。原创 2025-03-15 09:56:02 · 332 阅读 · 0 评论 -
Java时间戳的使用
时间戳(timestamp)是一个能够表示一份数据在某个特定时间点已经存在的、完整的、可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。它广泛应用于数据库、计算机系统、文件系统、软件以及通信等领域,用于确保数据的完整性和一致性,以及追踪数据的变化。时间戳的生成通常依赖于系统的时钟和时区设置,因此在全球范围内使用时需要注意时区差异和时钟同步问题。此外,为了确保时间戳的准确性和可信度,一些系统可能会采用第三方时间戳服务或硬件时间戳设备来生成和管理时间戳。原创 2024-11-06 16:58:09 · 592 阅读 · 0 评论 -
Java中的日期与时间的间隔:Period类、Duration类
在 Java 中,Period 类和 Duration 类都是用于表示时间间隔的类,但它们有不同的使用场景和特性。Period 类位于 java.time 包中,主要用于表示基于日期的时间间隔,即年、月、日的差异。它常用于处理日期之间的计算,例如计算两个日期之间的年数、月数和天数。Duration 类同样位于 java.time 包中,但它用于表示基于时间的时间间隔,即天、小时、分钟、秒、毫秒、纳秒的差异。它常用于处理时间之间的精确计算,例如计算两个时间点之间的差值。原创 2024-11-05 17:28:20 · 822 阅读 · 0 评论 -
Java中的时刻与时间戳:Instant类
Instant 类是 Java 8 引入的 java.time 包的一部分,用于表示一个时间点,通常以 UTC(协调世界时)时区表示。它提供了一种更加精确和灵活的时间表示方式,替代了旧的 java.util.Date 类。通过获取Instant 的对象可以获取此刻的时间,该时间由两部分组成:从1970-01-01 00:00:00 开始走到此刻的总秒数 + 不够1秒的纳秒数。原创 2024-11-05 15:28:19 · 824 阅读 · 0 评论 -
Java中的日期与时间格式化器:DateTimeFormatter类
DateTimeFormatter 是 Java 8 引入的一个类,属于 java.time.format 包,用于格式化(解析和打印)日期和时间对象。它提供了丰富的格式化模式,可以灵活地处理各种日期和时间格式。Java 中的 DateTimeFormatter 与 SimpleDateFormat 都是用于日期和时间格式化的工具类,但它们之间存在一些显著的区别。使用旧的 Date 对象时,我们通常使用 SimpleDateFormat 进行格式化显示。原创 2024-11-04 16:50:52 · 1214 阅读 · 0 评论 -
Java中的时区和带时区的时间对象:ZoneId类、ZonedDateTime类
在 Java 中,ZoneId 和 ZonedDateTime 是处理时区和带时区日期时间的重要类,它们属于 java.time 包,这个包是在 Java 8 中引入的,用于替代旧的日期和时间 API(java.util.Date、java.util.Calendar 等)。ZoneId 类表示时区信息,例如 "UTC"、"Asia/Shanghai"、"America/New_York" 等。它提供了获取时区偏移量、时区规则以及验证时区 ID 的方法。原创 2024-11-04 15:22:19 · 627 阅读 · 0 评论 -
Java中的日期与时间对象:LocalDate类、LocalTime类、LocalDateTime类
在 Java 中,LocalDate、LocalTime 和 LocalDateTime 是 java.time 包中的类,用于表示日期、时间和日期时间。这些类提供了不可变的日期与时间对象,是 Java 8 及以后版本中引入的一部分,用于替代旧的 java.util.Date 和 java.util.Calendar 类。LocalDate 类表示不带时间的日期,即年、月和日。LocalTime 类表示不带日期的时间,即小时、分钟、秒和纳秒。原创 2024-11-02 20:08:36 · 1598 阅读 · 0 评论 -
Java中的日期与时间对象:Date类、SimpleDateFormat类、Calendar类
在 Java 中,Date 类是 java.util 包的一部分,用于表示一个特定的瞬间,精确到毫秒。这个类封装了当前的日期和时间。不过,从 Java 8 开始,引入了新的日期和时间 API(位于 java.time 包中),提供了更现代、更灵活的日期和时间处理功能。尽管如此,了解 Date 类仍然对理解 Java 早期版本中的日期和时间处理很有帮助。Java 的 Calendar 类是 java.util 包中的一个抽象类,提供了操作日历字段如年、月、日、时、分、秒等的方法。原创 2024-11-01 18:28:47 · 1002 阅读 · 0 评论 -
Java使用apache.commons.io框架下的FileUtils类实现文件的写入、读取、复制、删除
Apache Commons IO 是 Apache 开源基金组织提供的一组有关IO(Input/Output)操作的小框架,它是 Apache Commons 项目的一部分,专注于提供简单易用的 API,用于处理输入和输出操作。Apache Commons IO 是一个功能强大的 Java IO工具库,提供了丰富的 API 来简化文件和流的操作。通过使用 Commons IO 库,开发者可以更加简洁、高效地完成文件和流的相关任务。原创 2024-10-30 18:52:56 · 1410 阅读 · 0 评论 -
Java使用JWT实现Token认证机制
JWT(JSON Web Token)是一种用于在网络上安全地传输信息的简洁的、URL 安全的表示方法,它定义了一个紧凑且自包含的方式,用于不同实体之间安全地传输信息(JSON格式)。JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效载荷)和 Signature(签名)。JWT是一种简单、安全、便捷的身份验证和授权机制,在现代Web应用程序中得到广泛应用。然而,在使用JWT时也需要注意其安全性问题,并采取相应的措施来确保JWT的安全性和完整性。原创 2024-10-29 17:56:02 · 2431 阅读 · 0 评论 -
Java非对称加密:RSA 数据加密与解密、数字签名与验签
非对称加密(asymmetric cryptography),也称为公开密钥加密(public-key cryptography),是密码学中的一种重要算法。非对称加密使用一对密钥进行加密和解密操作,这两个密钥分别是公开密钥(public key)和私有密钥(private key)。公开密钥可以公开给任何人使用,而私有密钥则必须保密,只有密钥的持有者才能访问。这两个密钥之间存在数学上的联系,但不能从一个推导出另一个。原创 2024-10-28 18:05:19 · 1729 阅读 · 0 评论 -
Java对称加密:AES 高级加密标准
AES(Advanced Encryption Standard),即高级加密标准,是一种对称加密算法,被广泛应用于信息安全领域,保护敏感信息的安全。AES 算法基于迭代和分组密码设计,通过一系列的加密操作,将明文转化为密文。其加密流程主要包括字节代换、行移位、列混合和轮密钥加变换等步骤。解密过程为加密过程的逆过程。AES 主要有两种加密模式:ECB 与 CBC 是两种不同的加密模式,它们在处理明文块的方式上存在显著差异,从而影响了其安全性和适用场景。原创 2024-10-25 16:51:27 · 907 阅读 · 0 评论 -
Java对称加密:DES、3DES 数据加密标准
对称加密,又称对称密钥加密或私钥加密,是一种在加密和解密过程中使用相同一个密钥的加密算法。这种加密方式的核心在于,发送方使用某个密钥对数据进行加密,接收方则使用完全相同的密钥对数据进行解密。由于加密和解密使用的是同一把“钥匙”,因此得名“对称加密”。对称加密是一种强大且高效的加密方式,但其安全性高度依赖于密钥的安全管理。因此,在实际应用中,需要采取额外的安全措施来保护密钥的安全,如使用密钥分发协议、密钥托管服务等。原创 2024-10-24 09:36:09 · 1132 阅读 · 0 评论 -
Java消息摘要:SHA 验证数据完整性、密码的加密
SHA(Secure Hash Algorithm,安全散列算法)是一个密码散列函数家族,被美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布为联邦数据处理标准(FIPS)。SHA 算法是基于 MD4 算法实现的,作为 MD 算法的继任者,成为新一代的消息摘要算法的代表。SHA 与 MD 算法不同之处主要在于摘要长度,SHA 算法可以生成一个被称为消息摘要的160位(20字节)散列值,而 MD5 的固定长度为128位(16字节)。原创 2024-10-21 17:11:52 · 713 阅读 · 0 评论 -
SpringBoot使用RestTemplate实现发送HTTP请求
RestTemplate 是 Spring 框架提供的一个用于访问 RESTful 服务的客户端工具,它简化了与 RESTful 服务的交互,并提供了一系列方便的方法来发送 HTTP 请求、处理响应以及处理错误。RestTemplate 提供了一组简单易用的方法,使得发送HTTP请求变得非常简单和直观。RestTemplate 可以自动将请求和响应的 JSON/XML 数据转换为 Java 对象,简化了数据的处理过程。原创 2024-10-19 18:06:22 · 1672 阅读 · 0 评论 -
Java使用HttpClient5实现发送HTTP请求
HttpClient5 是 Apache HttpComponents 项目中的一个重要组件,它是一个功能齐全且高度可定制的 HTTP 客户端库,专门用于发送 HTTP 请求、处理 HTTP 响应并支持各种 HTTP 协议特性。内置的连接池机制能提高并发处理性能,减少资源消耗。内置 Cookie 管理功能,能够自动处理服务端返回的 Cookie 并在后续请求中使用,模拟浏览器行为。HttpClient5 的设计高度模块化,用户可以根据需要对连接管理、重定向策略、请求重试策略、代理设置等进行灵活定制。原创 2024-10-18 18:10:28 · 1435 阅读 · 0 评论 -
Java使用原生HttpURLConnection实现发送HTTP请求
HttpURLConnection 是 Java 提供的原生标准的用于发送 HTTP 请求和接收 HTTP 响应的一个类,它位于 java.net 包下,并继承了 URLConnection 类。HttpURLconnection 是基于 HTTP 协议的,支持 get,post,put,delete 等各种请求方式,最常用的就是 get 和 post。URLConnection 提供了一组方法来建立与 URL 之间的连接、发送请求和接收响应。原创 2024-10-17 15:57:38 · 1634 阅读 · 0 评论 -
Java消息摘要:MD5 验证数据完整性、密码的加密
MD5(Message-Digest Algorithm 5)是一种被广泛使用的密码散列函数,是一种不可逆的加密算法,该算法可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5 由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1991年公布,用以取代 MD4 算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解。原创 2024-10-12 17:46:26 · 718 阅读 · 0 评论 -
Java编码方式:Base64 编码与解码
Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。它主要用于在不支持二进制数据的场合(如电子邮件、URL、文件系统名等)传输二进制数据。严格来说Base64 并不是一种加密/解密算法,而是一种编码方式。Base64 不生成密钥,通过Base64 编码后的密文就可以直接“翻译”为明文。原创 2024-10-05 17:19:19 · 2519 阅读 · 0 评论 -
Java使用BeanUtils.copyProperties实现对象的拷贝
BeanUtils.copyProperties 方法是 Java 中 Spring 框架提供的一个非常实用的工具方法,它用于将一个 JavaBean 对象的属性值拷贝到另一个 JavaBean 对象中。这个方法主要用于简化对象之间的数据转换过程,尤其是在处理具有大量相同属性的对象时,可以大大减少代码量,提高开发效率。原创 2024-09-30 17:27:48 · 1463 阅读 · 0 评论 -
JVM内存溢出和内存泄漏的区别
程序运行结束后,没有释放 所占用的内存空间。一次内存泄漏 似乎不会有大的影响,但内存泄漏 不断累积,最终可用内存会变得越来越少。比如说,总内存大小是100 MB,有40MB的内存一直无法回收,那么可用的只有60MB 。这40MB的就是内存泄漏。内存泄漏,就是程序运行结束后,没有释放的内存。程序运行时,在申请内存空间时,没有足够的内存空间供其正常使用,程序运行停止,并抛出 out of memory 。比如程序运行时申请了一个10MB 空间, 但是当前可用内存只有5MB,程序无法正常执行,这就是内存溢出。转载 2022-07-06 14:33:13 · 4841 阅读 · 0 评论 -
什么是OOM,为什么会OOM及一些解决方法
OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。看下关于的官方说明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. 意思就是说,当JVM因为没有足够的转载 2022-07-03 16:16:32 · 3277 阅读 · 1 评论