binarySearch仅适用于已排序且支持随机访问的List(如ArrayList),不支持Set或Map;未排序或非RandomAccess实现(如LinkedList)会导致结果错误或性能退化。

binarySearch 只能用于已排序的 List,不能直接查 Set 或 Map
Java 的 Collections.binarySearch() 仅支持 List 类型,且要求该列表**必须已按自然顺序或指定比较器排序**。对未排序的 ArrayList 直接调用会返回错误索引(比如负数),不是“找不到”,而是“结果无意义”。HashSet、TreeSet、HashMap 等都不支持该方法——TreeSet 虽然有序,但不提供索引,binarySearch 依赖随机访问(get(int)),而 TreeSet 没有索引概念。
用 Arrays.binarySearch() 处理数组更常见,List 需先转为数组或确保是 RandomAccess 实现
实际中,多数人用的是 Arrays.binarySearch(),因为它专为数组设计,性能稳定。若坚持用 List,需确认它是 ArrayList 这类支持 O(1) 随机访问的实现;LinkedList 虽然能传入 binarySearch,但每次 get(i) 是 O(n),整体退化为 O(n log n),完全失去二分意义。
- 对
int[]:用Arrays.binarySearch(int[], key) - 对
String[]:同上,元素必须已排序 - 对
ArrayList:先调用Collections.sort(list),再用Collections.binarySearch(list, key) - 自定义对象:必须实现
Comparable,或传入Comparator
返回值不是布尔值,负数表示插入点,别直接当 true/false 用
binarySearch 返回的是索引值:找到时返回 >=0 的位置;未找到时返回一个负数,其绝对值减 1 是该元素应插入的位置(即 -(insertionPoint) - 1)。常见误用是写成 if (binarySearch(...) != -1) 判断存在——这会漏掉元素恰好在索引 0 的情况(此时返回 0,合法);正确判断方式是 index >= 0。
int[] arr = {1, 3, 5, 7};
int pos = Arrays.binarySearch(arr, 5); // 返回 2
int notFound = Arrays.binarySearch(arr, 4); // 返回 -3 → 插入点是 2
并发修改或动态增删时,排序状态极易失效,binarySearch 结果不可信
这是最容易被忽略的隐性陷阱:哪怕你调用了一次 Collections.sort(),只要后续有 add()、remove()、或多个线程同时操作,列表就不再有序。binarySearch 不做任何校验,仍会执行查找,但结果完全不可预测。生产环境若需高频搜索,优先考虑 TreeSet(用 contains(),O(log n))或构建一次后转为不可变排序列表(如 ImmutableList.sortedCopyOf()),而不是反复手动维护排序+二分。
立即学习“Java免费学习笔记(深入)”;








