首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 判斷 String 是否為空的四種寫法效能實測與最佳實務

     編輯:Java 相關知識

判斷字串「非 null 且非空」是 Java 業務代碼最高頻操作之一。本文對比四種寫法的字節碼與實測效能,給出生產環境推薦標準。

四種寫法與字節碼差異

編號寫法說明字節碼關鍵指令
1str == null || "".equals(str)經典雙重檢查,常數 "" 呼叫 equalsldc "" + invokevirtual equals
2str == null || str.length() == 0直接檢查長度為 0invokevirtual length + ifne
3str == null || str.isEmpty()JDK 6+ 專用語意方法invokevirtual isEmpty (內部即 length() == 0)
4str == null || str == ""引用比較,依賴字串常數池,**極不推薦**if_acmpeq (僅對字面常數有效)

效能實測 (JDK 17, 1 億次循環)

// 測試程式碼結構
for (int i = 0; i < 10000; i++)
  for (int j = 0; j < 10000; j++)
    if (判斷條件) { /* empty */ }

結果 (ms):
JudgeString1 ("".equals) : 625
JudgeString2 (length==0) : 125
JudgeString3 (isEmpty)   : 234
JudgeString4 (== "")     : 109  ← 僅因 JIT 優化常數池引用比較,**實務不可靠**

深度分析

  • length() == 0 最快:單一 invokevirtual + 整數比較,JIT 易內聯優化。
  • isEmpty() 略慢:多一次方法呼叫 (雖內部同 length()==0),但語意更清晰,JDK 6+ 標準。
  • "" .equals(str) 最慢:虛擬呼叫 + 物件創建 (常數池已存在) + 內部迴圈比對。
  • str == "" 陷阱:new String("") == "" 為 false,僅字面常數才為 true,**絕不可用於運行時字串**。

最佳實務建議

// 1. 標準寫法 (JDK 6+)
if (str != null && !str.isEmpty()) { ... }

// 2. 工具類封裝 (推薦 Apache Commons Lang / Spring StringUtils)
if (StringUtils.isNotBlank(str)) { ... } // 同時去除空白字元

// 3. Java 11+ 字串新方法
if (str != null && !str.isBlank()) { ... } // isBlank: 全空白也視為空

常見錯誤模式

// ❌ 錯誤:先呼叫 equals 可能拋 NPE
if (str.equals("") || str == null) { ... }

// ✅ 正確:短路求值,先檢 null
if (str == null || str.isEmpty()) { ... }

// ❌ 錯誤:== 比較內容
if (str == "") { ... }

// ✅ 正確:長度或 isEmpty
if (str != null && str.length() == 0) { ... }

總結

首選 str != null && str.isEmpty() (JDK 6+) 或 str != null && str.length() == 0 (全版本)。引入工具類時優先 StringUtils.isNotBlank。嚴禁使用 == "" 或 != ""。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved