Java常用的判空方法

news2025/12/14 23:41:02

文章目录

  • 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,会抛出 NullPointerException
    Validate.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 校验并抛出 NPE
    System.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)字符串常量内容比较防 NPENPE 保险,简洁只能比较某个常量,与 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,在性能敏感、调用频繁的场景不必过度追求“风格统一”而牺牲性能;最推荐的日常写法则是根据类型(普通对象、字符串、取默认值)选最简洁、安全的工具方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2403170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel处理控件Aspose.Cells教程:使用 C# 在 Excel 中创建组合图表

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

【多线程初阶】阻塞队列 生产者消费者模型

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

《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》

目录 一、踏上Python之旅二、Python输入与输出三、变量与基本数据类型四、运算符五、流程控制 一、踏上Python之旅 1.想要输出 I Love Python,应该使用()函数。 A.printf() B.print() C.println() D.Print() 在Python中想要在屏幕中输出内容&#xff0c;应该使用print()函数…

机器人夹爪的选型与ROS通讯——机器人抓取系统基础系列(六)

文章目录 前言一、夹爪的选型1.1 任务需求分析1.2 软体夹爪的选型 二、夹爪的ROS通讯2.1 夹爪的通信方式介绍2.2 串口助手测试2.3 ROS通讯节点实现 总结Reference: 前言 本文将介绍夹爪的选型方法和通讯方式。以鞋子这类操作对象为例&#xff0c;将详细阐述了对应的夹爪选型过…

第二十八章 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 组成的轻量级数据湖方案&#xff0c;旨在解决传统数据湖&#xff08;如HadoopHive&#xff09;元数据管理复杂、查询性能低及厂商锁定等问题。该方案为中小规模数据湖场景提供了简单、高性能且无厂商锁定的替代选择。 1. 什么是 DuckLake 和 D…

大语言模型提示词(LLM Prompt)工程系统性学习指南:从理论基础到实战应用的完整体系

文章目录 前言&#xff1a;为什么提示词工程成为AI时代的核心技能一、提示词的本质探源&#xff1a;认知科学与逻辑学的理论基础1.1 认知科学视角下的提示词本质信息处理理论的深层机制图式理论的实际应用认知负荷理论的优化策略 1.2 逻辑学框架下的提示词架构形式逻辑的三段论…

如何基于Mihomo Party http端口配置git与bash命令行代理

如何基于Mihomo Party http端口配置git与bash命令行代理 1. 确定Mihomo Party http端口配置 点击内核设置后即可查看 默认7892端口&#xff0c;开启允许局域网连接 2. 配置git代理 配置本机代理可以使用 127.0.0.1 配置局域网内其它机代理需要使用本机的非回环地址 IP&am…

埃文科技智能数据引擎产品入选《中国网络安全细分领域产品名录》

嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;埃文科技智能数据引擎产品成功入选数据分级分类产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解这一蓬勃发展的产业格局&#xff0c;嘶吼安全产业…

NLP学习路线图(二十六):自注意力机制

一、为何需要你&#xff1f;序列建模的困境 在你出现之前&#xff0c;循环神经网络&#xff08;RNN&#xff09;及其变种LSTM、GRU是处理序列数据&#xff08;如文本、语音、时间序列&#xff09;的主流工具。它们按顺序逐个处理输入元素&#xff0c;将历史信息压缩在一个隐藏…

Unity3D仿星露谷物语开发60之定制角色其他部位

1、目标 上一篇中定制了角色的衬衫、手臂。 本篇中将定制角色其他部位的图形&#xff0c;包括&#xff1a;裤子、发型、皮肤、帽子等。 2、定制裤子 &#xff08;1&#xff09;修改ApplyCharacterCustomisation.cs脚本 我们需要设置一个输入框选择裤子的颜色。 // Select …

Google机器学习实践指南(机器学习模型泛化能力)

&#x1f525; Google机器学习(14)-机器学习模型泛化能力解析 Google机器学习(14)-机器学习模型泛化原理与优化&#xff08;约10分钟&#xff09; 一、泛化问题引入 ▲ 模型表现对比&#xff1a; 假设森林中树木健康状况预测模型&#xff1a; 图1&#xff1a;初始模型表现 …

MySQL性能调优:Mysql8高频面试题汇总

1&#xff0c;主键和唯一键有什么区别&#xff1f; 主键不能重复&#xff0c;不能为空&#xff0c;唯一键不能重复&#xff0c;可以为空。 建立主键的目的是让外键来引用。 一个表最多只有一个主键&#xff0c;但可以有很多唯一键 2&#xff0c;MySQL常用的存储引擎有哪些&…

vue+elementUI+springboot实现文件合并前端展示文件类型

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

高效绘制业务流程图!专业模板免费下载

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

Spring Boot + Prometheus 实现应用监控(基于 Actuator 和 Micrometer)

文章目录 Spring Boot Prometheus 实现应用监控&#xff08;基于 Actuator 和 Micrometer&#xff09;环境准备示例结构启动和验证验证 Spring Boot 应用Prometheus 抓取配置&#xff08;静态方式&#xff09;Grafana 面板配置总结 Spring Boot Prometheus 实现应用监控&…

PowerBI企业运营分析—列互换式中国式报表分析

PowerBI企业运营分析—列互换式中国式报表分析 欢迎来到Powerbi小课堂&#xff0c;在竞争激烈的市场环境中&#xff0c;企业运营分析平台成为提升竞争力的核心工具。 该平台通过高效整合多源数据&#xff0c;并实时监控关键指标&#xff0c;能够迅速揭示业务表现的全貌&#…

BugKu Web渗透之需要管理员

启动场景&#xff0c;打开网页&#xff0c;显示如下&#xff1a; 一般没有上面头绪的时候&#xff0c;就是两步&#xff1a;右键查看源代码 和 扫描网站目录。 步骤一&#xff1a; 右键查看源代码 和 扫描网站目录。 右键查看源代码没有发现异常。 于是扫描网站目录&…

TDengine 开发指南—— UDF函数

UDF 简介 在某些应用场景中&#xff0c;应用逻辑需要的查询功能无法直接使用内置函数来实现&#xff0c;TDengine 允许编写用户自定义函数&#xff08;UDF&#xff09;&#xff0c;以便解决特殊应用场景中的使用需求。UDF 在集群中注册成功后&#xff0c;可以像系统内置函数一…

使用vsftpd搭建FTP服务器(TLS/SSL显式加密)

安装vsftpd服务 使用vsftpd RPM安装包安装即可&#xff0c;如果可以访问YUM镜像源&#xff0c;通过dnf或者yum工具更加方便。 yum -y install vsftpd 启动vsftpd、查看服务状态 systemctl enable vsftpd systemctl start vsftpd systemctl status vsftpd 备份配置文件并进…