Java常用的判空方法
文章目录
- Java常用的判空方法
- JDK 自带的判空方法
- 1. 使用 == 或 != 运算符
- 2. 使用 equals 方法
- 3. Objects.isNull / Objects.nonNull
- 4. Objects.equals
- 4. JDK8 中的 Optional
- 第三方工具包
- 1. Apache Commons Lang3
- 2. Google Guava
- 3. Lombok 注解
- 4. Vavr(函数式风格)
- 小节
Java常用的判空方法
== :是一个比较运算符
==:既可以判断基本类型,又可以判断引用类型
==:如果判断的是基本类型,判断的是值是否相等。示例: int i=10; double d=10.0;
==:如果判断的是引用类型,判断的是地址是否相等,即判定是不是同一个对象
JDK 自带的判空方法
1. 使用 == 或 != 运算符
- 对于引用类型,可以使用
==
或!=
运算符来判断是否为null
Object obj;
if (obj == null) {// 对象为空的处理逻辑
} else {// 对象不为空的处理逻辑
}
2. 使用 equals 方法
- equals: 是Object类中的方法,只能判断引用类型。
- Object 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。
String str = "123";
if ("123".equals(str)) {// 字符串不为空且等于"123"的处理逻辑
} else {// 不相等或为 null
}
3. Objects.isNull / Objects.nonNull
String s = null;
if (Objects.isNull(s)) {System.out.println("s 是 null");
}
if (Objects.nonNull(s)) {System.out.println("s 不是 null");
}
4. Objects.equals
- 既能安全地判断两者是否相等,也能避免 NPE:
String a = null, b = "xdr";
if (Objects.equals(a, b)) {System.out.println("a 与 b 相等");
} else {System.out.println("a 与 b 不相等或其中之一为 null");
}
4. JDK8 中的 Optional
Optional<String> opt = Optional.ofNullable(getValue());
// 判空或提供默认值
String result = opt.orElse("default");
// 仅当存在时才执行
opt.ifPresent(v -> System.out.println("Value: " + v));
// 转换并取值
int len = opt.map(String::length).orElse(0);
第三方工具包
1. Apache Commons Lang3
(1)StringUtils
import org.apache.commons.lang3.StringUtils;String str = " ";
boolean isEmpty = StringUtils.isEmpty(str); // true if null or length == 0
boolean isBlank = StringUtils.isBlank(str); // true if null, empty, or whitespace only
(2)ObjectUtils
import org.apache.commons.lang3.ObjectUtils;Integer x = null;
// 如果 x 为 null,就返回默认值 100
int value = ObjectUtils.defaultIfNull(x, 100);
(3)Validate.notNull
import org.apache.commons.lang3.Validate;public void process(@Nullable String param) {// 如果 param 为 null,会抛出 NullPointerExceptionValidate.notNull(param, "param 不可为 null");// 之后可以安全使用 param
}
2. Google Guava
import com.google.common.base.Strings;
import com.google.common.base.MoreObjects;String s = null;
// 判空或空串
boolean isNullOrEmpty = Strings.isNullOrEmpty(s);// 取第一个非 null 的值
String first = MoreObjects.firstNonNull(s, "fallback");
3. Lombok 注解
import lombok.NonNull;public void save(@NonNull String name) {// 如果传入 name 为 null,Lombok 会在编译时生成一个 null 校验并抛出 NPESystem.out.println("Saving " + name);
}
4. Vavr(函数式风格)
import io.vavr.control.Option;Option<String> opt = Option.of(null);
opt.peek(v -> System.out.println("value: " + v)).onEmpty(() -> System.out.println("No value"));
小节
- 以下是常见判空方式的适用场景、可读性与大致性能对比
方法 | 场景/用途 | 优点 | 缺点 | 性能(大致) |
---|---|---|---|---|
obj == null / obj != null | 最基础的引用类型判空 | 最直观、最轻量,CPU 层面就是一次单纯的指针比较 | 代码稍显啰嗦,不能直接判断空串或空白 | 最快 |
Objects.isNull(obj) nonNull() | 同上,但风格更统一 | 可读性稍好,链式流式 API (filter(Objects::nonNull) ) | 底层还是调用 obj == null ,无额外性能提升 | 与 == 相当 |
Objects.equals(a, b) | 安全的双侧相等比较(可能有一侧为 null ) | 一步搞定对称比较,无 NPE | 只做相等判断,不能区分 “一侧为 null” 还是 “都不等” | 微弱开销(静态方法调用) |
"const".equals(str) | 字符串常量内容比较防 NPE | NPE 保险,简洁 | 只能比较某个常量,与 null 判空是混用场景 | 极快,几乎和 == 相当 |
Optional.ofNullable(...).orElse(...) | 需要“取值或默认” 或做串联式空值处理 | 流式可读、链式转换、函数式风格 | 重对象分配、方法链调用、垃圾更频繁,不适合热路径或循环中频繁调用 | 最慢,不建议在性能敏感处 |
StringUtils.isBlank/isEmpty(...) | 判空串(null 、"" 、空白) | 语义清晰,一次判断多种“空”场景 | 需引入依赖(Apache Commons Lang) | 依赖少量方法调用 |
MoreObjects.firstNonNull(a, b) | 在 Guava 项目中取“首个非空” | 语义明确,单行搞定 | 同上需依赖 Guava;抛 NPE(若两者皆为 null) | 依赖少量方法调用 |
@NonNull (Lombok) | 方法入参校验 | 编译时自动生成 NPE 校验,消除手写 文档化注解 | 仅针对入参,编译时插桩;运行时抛 NullPointerException | 与手写 if (x==null) throw 相当 |
Option.of(...) (Vavr) | 纯函数式或复杂流式场景 | 函数式安全链式操作 | 学习成本、依赖较大;性能、GC 开销都比 Optional 略高 | 慢于 Optional |
综合建议
1、简单判空
-
性能最优:直接 obj == null / obj != null,尤其在高频调用、热点代码路径中。
-
流式场景:若要更好地融入 Java 8 流式 API,可用 Objects.nonNull 做过滤:
list.stream().filter(Objects::nonNull).forEach(...);
2、字符串判空/判空白
- 使用 StringUtils.isBlank(str)(Apache Commons Lang3)或 Strings.isNullOrEmpty(str)(Guava),比手写 str == null || str.trim().isEmpty() 更简洁。
3、安全比较
- 相等判断首选 Objects.equals(a, b),或把常量放前 “const”.equals(str),避免 NPE。
4、取默认值
- 如果只是“当 null 时返回默认值”,可优先 ObjectUtils.defaultIfNull(obj, defaultVal)(Lang3)或 MoreObjects.firstNonNull(obj, defaultVal)(Guava),比 Optional.ofNullable(obj).orElse(defaultVal) 轻量。
5、函数式风格
- 若项目已全面采用函数式(Vavr)或需要在 API 边界使用 Optional,可接受它们带来的对象分配和链式调用成本。但不建议在循环、热点方法里反复 new Optional。
6、注解校验
- 对于公共 API 的入参校验,推荐使用 Lombok 的 @NonNull(或用 @Validated/Bean Validation),把校验编译或运行时自动化,提升代码可读性和一致性。
性能排序(参考)
== / !=
Objects.isNull / nonNull
Objects.equals / "const".equals()
StringUtils.isBlank / Strings.isNullOrEmpty
ObjectUtils.defaultIfNull / MoreObjects.firstNonNull
Optional.ofNullable().orElse()
Vavr Option.of()
- 总体来说,最轻量的始终是最原生的 == null,在性能敏感、调用频繁的场景不必过度追求“风格统一”而牺牲性能;最推荐的日常写法则是根据类型(普通对象、字符串、取默认值)选最简洁、安全的工具方法。
相关文章:
Java常用的判空方法
文章目录 Java常用的判空方法JDK 自带的判空方法1. 使用 或 ! 运算符2. 使用 equals 方法3. Objects.isNull / Objects.nonNull4. Objects.equals4. JDK8 中的 Optional 第三方工具包1. Apache Commons Lang32. Google Guava3. Lombok 注解4. Vavr(函数式风格&…...

Excel处理控件Aspose.Cells教程:使用 C# 在 Excel 中创建组合图表
可视化项目时间线对于有效规划和跟踪至关重要。在本篇教程中,您将学习如何使用 C# 在 Excel 中创建组合图。只需几行代码,即可自动生成动态、美观的组合图。无论您是在构建项目管理工具还是处理内部报告,本指南都将向您展示如何将任务数据转换…...

【多线程初阶】阻塞队列 生产者消费者模型
文章目录 一、阻塞队列二、生产者消费者模型(一)概念(二)生产者消费者的两个重要优势(阻塞队列的运用)1) 解耦合(不一定是两个线程之间,也可以是两个服务器之间)2) 削峰填谷 (三)生产者消费者模型付出的代价 三、标准库中的阻塞队列(一)观察模型的运行效果(二)观察阻塞效果1) 队…...

《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》
目录 一、踏上Python之旅二、Python输入与输出三、变量与基本数据类型四、运算符五、流程控制 一、踏上Python之旅 1.想要输出 I Love Python,应该使用()函数。 A.printf() B.print() C.println() D.Print() 在Python中想要在屏幕中输出内容,应该使用print()函数…...

机器人夹爪的选型与ROS通讯——机器人抓取系统基础系列(六)
文章目录 前言一、夹爪的选型1.1 任务需求分析1.2 软体夹爪的选型 二、夹爪的ROS通讯2.1 夹爪的通信方式介绍2.2 串口助手测试2.3 ROS通讯节点实现 总结Reference: 前言 本文将介绍夹爪的选型方法和通讯方式。以鞋子这类操作对象为例,将详细阐述了对应的夹爪选型过…...

第二十八章 RTC——实时时钟
第二十八章 RTC——实时时钟 目录 第二十八章 RTC——实时时钟 1 RTC实时时钟简介 2 RTC外设框图剖析 3 UNIX时间戳 4 与RTC控制相关的库函数 4.1 等待时钟同步和操作完成 4.2 使能备份域涉及RTC配置 4.3 设置RTC时钟分频 4.4 设置、获取RTC计数器及闹钟 5 实时时…...

使用 DuckLake 和 DuckDB 构建 S3 数据湖实战指南
本文介绍了由 DuckDB 和 DuckLake 组成的轻量级数据湖方案,旨在解决传统数据湖(如HadoopHive)元数据管理复杂、查询性能低及厂商锁定等问题。该方案为中小规模数据湖场景提供了简单、高性能且无厂商锁定的替代选择。 1. 什么是 DuckLake 和 D…...

大语言模型提示词(LLM Prompt)工程系统性学习指南:从理论基础到实战应用的完整体系
文章目录 前言:为什么提示词工程成为AI时代的核心技能一、提示词的本质探源:认知科学与逻辑学的理论基础1.1 认知科学视角下的提示词本质信息处理理论的深层机制图式理论的实际应用认知负荷理论的优化策略 1.2 逻辑学框架下的提示词架构形式逻辑的三段论…...

如何基于Mihomo Party http端口配置git与bash命令行代理
如何基于Mihomo Party http端口配置git与bash命令行代理 1. 确定Mihomo Party http端口配置 点击内核设置后即可查看 默认7892端口,开启允许局域网连接 2. 配置git代理 配置本机代理可以使用 127.0.0.1 配置局域网内其它机代理需要使用本机的非回环地址 IP&am…...
CMake 为 Debug 版本的库或可执行文件添加 d 后缀
在使用 CMake 构建项目时,我们经常需要区分 Debug 和 Release 构建版本。一个常见的做法是为 Debug 版本的库或可执行文件添加后缀(如 d),例如 libmylibd.so 或 myappd.exe。 本文将介绍几种在 CMake 中实现为 Debug 版本自动添加 d 后缀的方法。 方法一:使用 CMAKE_DEBU…...
Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit
Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit 在Linux权限系统中,除了基本的读、写(w)、执行(x)权限外,还有三个特殊权限位:SetUID、SetGID和Sticky Bit。这些权限位提供了更精细的权限控制机制,尤其在需要临时提升权限或管理共享资源时非常有用。 一、SetUID (s位…...

埃文科技智能数据引擎产品入选《中国网络安全细分领域产品名录》
嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,埃文科技智能数据引擎产品成功入选数据分级分类产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解这一蓬勃发展的产业格局,嘶吼安全产业…...
使用VTK还是OpenGL集成到qt程序里哪个好?
在Qt程序中集成VTK与OpenGL:选择哪个更好? 在Qt程序中实现三维可视化时,开发者常常面临一个选择:是使用VTK(Visualization Toolkit)还是OpenGL(Open Graphics Library)。这两种技术…...
Java-IO流之打印流详解
Java-IO流之打印流详解 一、打印流概述1.1 什么是打印流1.2 打印流的特点1.3 打印流的应用场景 二、PrintStream详解2.1 基本概念2.2 构造函数2.3 核心方法2.4 使用示例 三、PrintWriter详解3.1 基本概念3.2 构造函数3.3 核心方法3.4 使用示例 四、PrintStream与PrintWriter的比…...
高效图像处理:使用 Pillow 进行格式转换与优化
高效图像处理:使用 Pillow 进行格式转换与优化 1. 背景引入 在图像处理应用中,格式转换、裁剪、压缩等操作是常见需求。Python 的 Pillow 库基于 PIL(Python Imaging Library),提供 轻量、强大 的图像处理能力,广泛用于 Web 开发、数据分析、机器学习 等领域。 本文将…...
Github 2025-06-06 Java开源项目日报Top10
根据Github Trendings的统计,今日(2025-06-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10TypeScript项目1Java实现的算法集合:使用Gitpod.io进行编辑和贡献 创建周期:2883 天开发语言:Java协议类型:MIT LicenseStar数量…...
使用 Ansible 在 Windows 服务器上安装 SSL 证书
在本教程中,我将向您展示如何使用 Ansible 在 Windows 服务器上安装 SSL 证书。使用 Ansible 自动化 SSL 证书安装过程可以提高 IT 运营的效率、一致性和协作性。我将介绍以下步骤: 将 SSL 证书文件复制到服务器将 PFX 证书导入指定的存储区获取导入的证…...
厂区能源监控系统:网关赋能下的高效能源管理与环保监测
在现代工业生产领域,能源的有效利用与环境保护是企业实现可持续发展的两大关键要素。厂区能源监控系统借助先进的信息技术与自动化控制手段,对厂区内能源消耗及污水处理等核心环节展开实时监控与精细化管理。其中,御控网关作为系统关键枢纽&a…...
CentOS 7 如何安装llvm-project-10.0.0?
CentOS 7 如何安装llvm-project-10.0.0? 需要先升级gcc至7.5版本,详见CentOS 7如何编译安装升级gcc版本?一文 # 备份之前的yum .repo文件至 /tmp/repo_bak 目录 mkdir -p /tmp/repo_bak && cd /etc/yum.repo.d && /bin/mv ./*.repo …...
Cursor 1.0 的核心功能亮点及技术价值分析
Cursor 1.0 的核心功能亮点及技术价值分析 结合官方更新和开发者实测整理: 🛠️ 一、BugBot:智能自动化代码审查 功能亮点:深度集成 GitHub,自动扫描 Pull Request(PR)中的潜在 Bug(…...
软考 系统架构设计师系列知识点之杂项集萃(83)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(82) 第150题 体系结构权衡分析方法(Architecture Tradeoff Analysis Method,ATAM)是一种常见的系统架构评估框架,该框架主要关注系统的…...

NLP学习路线图(二十六):自注意力机制
一、为何需要你?序列建模的困境 在你出现之前,循环神经网络(RNN)及其变种LSTM、GRU是处理序列数据(如文本、语音、时间序列)的主流工具。它们按顺序逐个处理输入元素,将历史信息压缩在一个隐藏…...

Unity3D仿星露谷物语开发60之定制角色其他部位
1、目标 上一篇中定制了角色的衬衫、手臂。 本篇中将定制角色其他部位的图形,包括:裤子、发型、皮肤、帽子等。 2、定制裤子 (1)修改ApplyCharacterCustomisation.cs脚本 我们需要设置一个输入框选择裤子的颜色。 // Select …...
C++动态链接库封装,供C#/C++ 等编程语言使用——C++动态链接库概述(总)
目录: 一、前言及背景1.1需求描述1.2常见编程语言对比1.3应用背景 二、C对外接口2.1C对外封装2.2基于目标平台封装接口形式 三、系列文章汇总 一、前言及背景 1.1需求描述 不同的编程语言,具有不同的编程生态环境,对于项目应用来说ÿ…...

Google机器学习实践指南(机器学习模型泛化能力)
🔥 Google机器学习(14)-机器学习模型泛化能力解析 Google机器学习(14)-机器学习模型泛化原理与优化(约10分钟) 一、泛化问题引入 ▲ 模型表现对比: 假设森林中树木健康状况预测模型: 图1:初始模型表现 …...

MySQL性能调优:Mysql8高频面试题汇总
1,主键和唯一键有什么区别? 主键不能重复,不能为空,唯一键不能重复,可以为空。 建立主键的目的是让外键来引用。 一个表最多只有一个主键,但可以有很多唯一键 2,MySQL常用的存储引擎有哪些&…...
Neo4j 数据建模:原理、技术与实践指南
Neo4j 作为领先的图数据库,其核心优势在于利用图结构直观地表达和高效地查询复杂关系。其数据建模理念与传统关系型数据库截然不同,专注于实体(节点)及其连接(关系)。以下基于官方文档,系统阐述其建模原理、关键技术、实用技巧及最佳实践: 一、 核心原理:以关系为中心…...
【数据结构知识分享】顺序表详解
一、存储结构 物理相邻性: 若元素 a 和 b 逻辑相邻,则它们在内存中的地址也连续(如 &a[i1] &a[i] sizeof(ElemType))。 内存布局x: 基地址 索引 元素大小,通过首地址直接计算任意位置地址。 …...

vue+elementUI+springboot实现文件合并前端展示文件类型
项目场景: element的table上传文件并渲染出文件名称点击所属行可以查看文件,并且可以导出合并文件,此文章是记录合并文档前端展示的帖子 解决方案: 后端定义三个工具类 分别是pdf,doc和word的excle的目前我没整 word的工具类 package com.sc.modules…...

高效绘制业务流程图!专业模板免费下载
在复杂的业务流程管理中,可视化工具已成为提升效能的核心基础设施。为助力开发者、项目经理及业务架构师高效落地流程标准化,本文将为你精选5套开箱即用的专业流程图模板。这些模板覆盖跨部门协作、电商订单、客户服务等高频场景,具备以下核心…...