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

Java 使用 Set 高效判斷 Map Key 是否存在

     編輯:Java 程式設計入門

應用場景

需快速判斷某分行代碼 sgdBrId 是否包含在使用者可檢視分行清單 userViewBranchs 中。原始資料為逗號分隔字串,轉為 Set 後可達 O(1) 查找複雜度。

程式碼實作

public boolean checkSGDLookPre(String sgdBrId, Ce_sysuser cuser) {
    // 角色 6 為超級管理員,直接放行
    if (cuser.getSu_RoleId() == 6) {
        return true;
    }

    // 字串分割轉陣列
    String[] strArray = cuser.getUserViewBranchs().split(",");

    // 建立 HashSet,自動去重並提供 O(1) contains 查詢
    Set<String> strSet = new HashSet<>();
    CollectionUtils.addAll(strSet, strArray);  // Apache Commons Collections 工具

    return strSet.contains(sgdBrId);
}

關鍵點解析

技術點說明
split(",")將逗號分隔字串轉為陣列
HashSet基於雜湊表,contains 平均 O(1) 時間複雜度
CollectionUtils.addAll一次將陣列所有元素加入集合,簡化迴圈寫法
角色判斷優先提前返回避免不必要運算

替代寫法(Java 8+ Stream)

// 無需額外依賴,純 JDK 實現
return cuser.getSu_RoleId() == 6 ||
       Arrays.stream(cuser.getUserViewBranchs().split(","))
             .collect(Collectors.toSet())
             .contains(sgdBrId);

效能比較

  • List.contains:O(n) 線性搜尋,資料量大時明顯較慢
  • Set.contains:O(1) 雜湊查找,適合頻繁查詢場景
  • 陣列迴圈:O(n) 且程式碼冗長

注意事項

  • 若 userViewBranchs 為空字串或 null,split 會產生長度為 1 的陣列(含空字串),建議加入防禦性檢查
  • 大小寫敏感性:若分行代碼不區分大小寫,可統一 toUpperCase() 後再存入 Set
  • 記憶體開銷:HashSet 比 ArrayList 佔用更多記憶體,但查詢效能提升顯著

總結

將「需頻繁查詢是否包含」的集合資料結構從 List/陣列轉為 HashSet,是經典的以空間換時間優化手法。配合 CollectionUtils 或 Stream API,程式碼既簡潔又高效。

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