Java判斷null的幾種方式及適用場景分析
在 Java 中,判斷對象是否為 null
是編程中最常見的操作之一。以下是幾種主要的判斷方式及其適用場景:
一、直接使用 == null(最基礎(chǔ))
if (obj == null) { // 對象為 null 的處理邏輯 }
- 優(yōu)點:簡單直接,性能最優(yōu)(無額外方法調(diào)用)。
- 缺點:需要手動處理每個對象,代碼冗余。
- 適用場景:任何場景,尤其是性能敏感的代碼。
二、Objects.isNull ()(JDK 8+)
import java.util.Objects; if (Objects.isNull(obj)) { // 對象為 null 的處理邏輯 }
- 優(yōu)點:語義清晰,Null 安全(傳入 null 不會 NPE)。
- 缺點:本質(zhì)是對
== null
的封裝,性能略低于直接判斷。 - 適用場景:代碼可讀性要求高,避免空指針風(fēng)險。
三、Objects.nonNull ()(JDK 8+)
if (Objects.nonNull(obj)) { // 對象不為 null 的處理邏輯 }
- 優(yōu)點:與
Objects.isNull()
配對,語義明確。 - 適用場景:與 Stream、Optional 等結(jié)合使用。
四、Optional 類(JDK 8+)
import java.util.Optional; Optional<String> optional = Optional.ofNullable(obj); if (optional.isPresent()) { // 對象不為 null 的處理邏輯 } else { // 對象為 null 的處理邏輯 } // 更優(yōu)雅的用法(避免 if-else) optional.ifPresent(value -> System.out.println(value));
- 優(yōu)點:強(qiáng)制開發(fā)者處理 null 情況,避免 NPE;支持鏈?zhǔn)讲僮鳌?/li>
- 缺點:代碼略顯繁瑣,適合復(fù)雜流程處理。
- 適用場景:處理可能缺失值的函數(shù)式編程,避免深層嵌套的 null 檢查。
五、Apache Commons Lang(第三方庫)
import org.apache.commons.lang3.ObjectUtils; if (ObjectUtils.isEmpty(obj)) { // 對象為 null 或空(適用于字符串、集合等) } if (ObjectUtils.isNotEmpty(obj)) { // 對象不為 null 且非空 }
- 優(yōu)點:提供更豐富的空值判斷(如空字符串、空集合)。
- 缺點:需引入依賴。
- 適用場景:需要統(tǒng)一處理多種類型空值的場景。
六、StringUtils(Apache Commons Lang)
專門用于字符串的空值判斷:
import org.apache.commons.lang3.StringUtils; if (StringUtils.isBlank(str)) { // 字符串為 null、空字符串或僅含空格 } if (StringUtils.isEmpty(str)) { // 字符串為 null 或空字符串(不檢查空格) }
- 優(yōu)點:處理字符串時更全面,避免
str.length() == 0
的 NPE 風(fēng)險。 - 適用場景:字符串處理場景。
七、三元運算符(簡化賦值)
// 對象為 null 時賦默認(rèn)值 String result = (obj == null) ? "default" : obj; // 等價于 String result; if (obj == null) { result = "default"; } else { result = obj; }
- 優(yōu)點:代碼簡潔,適合簡單賦值場景。
- 缺點:邏輯復(fù)雜時可讀性下降。
八、使用斷言(開發(fā)階段)
import static org.junit.Assert.assertNotNull; // 在測試或開發(fā)階段強(qiáng)制要求對象非空 assertNotNull(obj, "對象不能為 null");
- 優(yōu)點:快速定位問題,避免錯誤數(shù)據(jù)流入后續(xù)流程。
- 缺點:斷言默認(rèn)在生產(chǎn)環(huán)境禁用,不可用于業(yè)務(wù)邏輯判斷。
- 適用場景:單元測試、方法參數(shù)校驗。
性能對比
方式 | 性能(相對) |
---|---|
== null | 最快 |
Objects.isNull() | 接近 == |
Optional | 較慢(涉及對象創(chuàng)建) |
最佳實踐
- 優(yōu)先使用
== null
:簡單場景直接判斷,性能最優(yōu)。 - 復(fù)雜流程用
Optional
:避免深層嵌套的 null 檢查,提高代碼可讀性。 - 字符串處理用
StringUtils
:避免str.isEmpty()
的 NPE 風(fēng)險。 - 集合 / 數(shù)組用
CollectionUtils.isEmpty()
:統(tǒng)一處理多種類型的空值。 - 避免過度使用
Optional
:簡單場景直接判斷更清晰,濫用會導(dǎo)致代碼冗余。
示例對比
傳統(tǒng)方式:
if (user != null && user.getAddress() != null && user.getAddress().getCity() != null) { System.out.println(user.getAddress().getCity()); }
Optional 方式:
Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .ifPresent(System.out::println);
根據(jù)場景選擇合適的判斷方式,既能保證代碼健壯性,又能提升可讀性。
到此這篇關(guān)于Java判斷null的幾種方式的文章就介紹到這了,更多相關(guān)Java判斷null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot JS-SDK自定義微信分享的實現(xiàn)
這篇文章主要介紹了SpringBoot JS-SDK自定義微信分享的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09監(jiān)控Spring Boot 項目運行情況操作方法
在實際開發(fā)中,經(jīng)常會遇到想要獲取到服務(wù)器應(yīng)用的運行情況的場景,在微服務(wù)架構(gòu)下對于每個應(yīng)用運行情況的監(jiān)控是保證系統(tǒng)高可用的關(guān)鍵,本文給大家介紹如何實現(xiàn)在Spring Boot的jar包中對系統(tǒng)的運行情況進(jìn)行監(jiān)控操作,感興趣的朋友跟隨小編一起看看吧2024-08-08elasticsearch數(shù)據(jù)信息索引操作action?support示例分析
這篇文章主要為大家介紹了elasticsearch數(shù)據(jù)信息索引操作action?support示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04微服務(wù)架構(gòu)之使用RabbitMQ進(jìn)行異步處理方式
本文介紹了RabbitMQ的基本概念、異步調(diào)用處理邏輯、RabbitMQ的基本使用方法以及在Spring Boot項目中使用RabbitMQ解決高并發(fā)問題,RabbitMQ是一種流行的消息隊列實現(xiàn),支持異步通信,可以有效解耦應(yīng)用程序的不同部分,并將任務(wù)分發(fā)給多個消費者2025-02-02