判斷無序陣列是否包含特定值,是 Java 開發中極常見的操作,也是 Stack Overflow 上的熱門議題。不同實作方式的時間複雜度差異巨大,本文將透過實測數據對比四種主流方案。
public static boolean useList(String[] arr, String targetValue) {
return Arrays.asList(arr).contains(targetValue);
}
public static boolean useSet(String[] arr, String targetValue) {
Set<String> set = new HashSet<>(Arrays.asList(arr));
return set.contains(targetValue);
}
public static boolean useLoop(String[] arr, String targetValue) {
for (String s : arr) {
if (s.equals(targetValue)) return true;
}
return false;
}
public static boolean useArraysBinarySearch(String[] arr, String targetValue) {
int a = Arrays.binarySearch(arr, targetValue);
return a >= 0; // 注意:找到時回傳索引 >= 0,未找到回傳負數
}
重要提醒:binarySearch 僅適用於已排序陣列。無序陣列使用會產生不可預期結果,本文列入僅為完整性比較。
測試策略:不同規模陣列(5、1,000、10,000),各執行 100,000 次查找,單位:毫秒(ms)
useList: 13 useSet: 72 useLoop: 5 useArraysBinarySearch: 9
useList: 112 useSet: 2,055 useLoop: 99 useArraysBinarySearch: 12
useList: 1,590 useSet: 23,819 useLoop: 1,526 useArraysBinarySearch: 12
for-each 迴圈效能最佳,無額外物件建立開銷。Arrays.asList 不複製資料,僅包裝陣列,查找本質仍是線性掃描,效能接近迴圈。HashSet(O(n) 建構 + 雜湊計算),僅適合重複查找場景(建構一次,查詢多次)。Arrays.binarySearch原文連結:ProgramCreek 翻譯版