Java isEmpty() Versus size()
Java isEmpty() Versus size()
Java isEmpty() Versus size()
Java isEmpty() Versus size()
結論:優先使用 isEmpty()
效能比較
ArrayList 實作
java// ArrayList.isEmpty() - O(1)
public boolean isEmpty() {
return size == 0;
}
// ArrayList.size() - O(1)
public int size() {
return size;
}
效能差異:幾乎相同
LinkedList 實作
java// LinkedList.isEmpty() - O(1)
public boolean isEmpty() {
return size == 0;
}
// LinkedList.size() - O(1) (Java 1.5+ 已優化)
public int size() {
return size;
}
效能差異:現代版本中相同
特殊情況 - 某些 Set 實作
java// 某些自訂集合可能這樣實作
public boolean isEmpty() {
return !iterator().hasNext(); // 可能更高效
}
public int size() {
// 需要遍歷整個集合計算 - O(n)
int count = 0;
for (Object o : this) count++;
return count;
}
可讀性比較
java// ✅ 語意清楚,意圖明確
if (list.isEmpty()) {
System.out.println(“列表是空的”);
}
// ❌ 需要額外思考,不夠直觀
if (list.size() == 0) {
System.out.println(“列表是空的”);
}
維護性
isEmpty() 的優勢
java// 如果未來需要改變”空”的定義,只需修改 isEmpty()
public boolean isEmpty() {
return size == 0 && !hasSpecialElements();
}
// 所有使用 isEmpty() 的地方都會自動適用新邏輯
size() == 0 的問題
java// 如果有100個地方使用 size() == 0
// 需要修改100個地方才能改變”空”的邏輯
空指標安全性
javaList
// 兩種方法都會拋出 NullPointerException
list.isEmpty(); // NPE
list.size() == 0; // NPE
// 安全的檢查方式
if (list != null && list.isEmpty()) { … }
// 或使用工具類別
if (CollectionUtils.isEmpty(list)) { … } // Apache Commons
實際效能測試
對於常見集合類別(ArrayList, LinkedList, HashSet 等):
效能差異微乎其微(奈秒級別)
JIT 編譯器會優化這些簡單操作
實際應用中不會有明顯差別
程式碼檢查工具建議
java// SonarQube 等工具會建議
if (list.size() == 0) { … } // 警告:應使用 isEmpty()
// PMD, Checkstyle 也有類似規則
最佳實務建議
✅ 推薦做法
java// 1. 使用 isEmpty()
if (collection.isEmpty()) { … }
// 2. 加上空值檢查
if (collection != null && collection.isEmpty()) { … }
// 3. 使用工具類別
if (CollectionUtils.isEmpty(collection)) { … }
❌ 避免做法
java// 不推薦
if (collection.size() == 0) { … }
// 絕對不要這樣
if (collection.size() < 1) { … }
結論:始終使用 isEmpty(),這是業界標準實務!