Java判断null的几种方式及适用场景分析
目录
- 一、直接使用 == null(最基础)
- 二、Objects.isNull ()(JDK 8+)
- 三、Objects.nonNull ()(JDK 8+)
- 四、Optional 类(JDK 8+)
- 五、Apache Commons Lang(第三方库)
- 六、StringUtils(Apache Commons Lang)
- 七、三元运算符(简化赋值)
- 八、使用断言(开发阶段)
- 性能对比
- 最佳实践
- 示例对比
在 Java 中,判断对象是否为 null
是编程中最常见的操作之一。以下是几种主要的判断方式及其适用场景:
一、直接使用 == null(最基础)
if (obj == null) { // 对象为 null 的处理逻辑 }
- 优点:简单直接,性能最优(无额外方法调用)。
- 缺点:需要手动处理每个对象,代码冗余。
- 适用场景:任何场景,尤其是性能敏感的代码。
二、Objects.isNull ()(JDK 8+)
import java.util.Objects; if (Objects.isNull(obj)) { // 对象为 null 的处理逻辑 }
- 优点:语义清晰,Null 安全(传入 null 不会 NPE)。
- 缺点:本质是对
== null
的封装,性能略低于直接判断。 - 适用场景:代码可读性要求高,避免空指针风险。
三、Objects.nonNull ()(JDK 8+)
if (Objects.nonNull(obj)) { // 对象不为 null 的处理逻辑 }
- 优点:与
Objects.isNull()
配对,语义明确。 - 适用场景:与 Stream、Optional 等结合使用。
四、Optional 类(JDK 8+)
import java.util.Optional; Optional<String> optional = Optional.ofNullable(obj); if (optional.isPresent()) { // 对象不为 null 的处理逻辑 } else { // 对象为 null 的处理逻辑 } // 更优雅的用法(避免 if-else) optional.ifPresent(value -> System.out.println(value));
- 优点:强制开发者处理 null 情况,避免 NPE;支持链式操作。
- 缺点:代码略显繁琐,适合复杂流程处理。
- 适用场景:处理可能缺失值的函数式编js程,避免深层嵌套的 nullpython 检查。
五、Apache Commons Lang(第三方库)
import org.apache.commons.lang3.ObjectUtils; if (ObjectUtils.isEmpty(obj)) { // 对象为 null 或空(适用于字符串、集合等) } if (ObjectUtils.isNotEmpty(obj)) { // 对象不为 null 且非空 }
- 优点:提供更丰富的空值判断(如空字符串、空集合)。
- 缺点:需引入依赖。
- 适用场景:需要统一处理多种类型空值的场景。
六、StringUtils(Apache Commons Lang)
专门用于字符串的空值判断:
import org.apache.commons.lang3.StringUtils; if (StringUtils.isBlank(str)) { // 字符串为 null、空字符串或仅含空格 } if (StringUtils.isEmpty(str)) { // 字符串为 null 或空字符串(不检查空格) }
- 优点:处理字符串时更全面,避免
str.length() == 0
的 NPE 风险。 - 适用场景:字符串处理场景。
七、三元运算符(简化赋值)
// 对象为 null 时赋默认值 String result = (obj == null) ? "default" : obj; // 等价于 String result; if (obj == null) { result = "default"; } else { result = obj; }
- 优点:代码简洁,适合简单赋值场景。
- 缺点:逻辑复杂时可读性下降。
八、使用断言(开发阶段)
import static org.junit.Assert.assertNotNull; // 在测试或编程客栈开发阶段强制要求对象非空 assertNotNull(obj, "对象不能为 null");
- 优点:快速定位问题,避免错误数据流入后续流程。
- 缺点:断言默认在生产环境禁用,不可用于业务逻辑判断。
- 适用场景:单元测试、方法参数校验。
性能对比
方式 | 性能(相对) |
---|---|
== null | 最快 |
Objects.isNull() | 接近 == |
Optional | 较慢(涉及对象创建) |
最佳实http://www.devze.com践
- 优先使用
== null
:简单场景直接判断,性能最优。 - 复杂流程用
Optional
:避免深层嵌套的 null 检查,提高代码可读性。 - 字符串处理用
StringUtils
:避免str.isEmpty()
的 NPE 风险。 - 集合 / 数组用
CollectionUtils.isEmpty()
:统一处理多种类型的空值。 - 避免过度使用
Optional
:简单场景直接判断更清晰,滥用会导致代码冗余。
示例对比
传统方式:
if (user != null && user.getAddress() != null && user.getAddress().getCity() != null) { System.out.println(user.getAddress().getCity()); }
Optional 方式:
Optional.ofNujavascriptllable(user) .map(User::getAddress) .map(Address::getCity) .ifPresent(System.out::println);
根据场景选择合适的判断方式,既能保证代码健壮性,又能提升可读性。
到此这篇关于Java判断null的几种方式的文章就介绍到这了,更多相关Java判断null内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论