arrays.binarysearch不是万能搜索函数,仅在数组严格升序(或按指定comparator有序)时可靠;查到返回非负索引,查不到返回负值,其绝对值减1即为应插入位置;必须先排序且不校验顺序,乱序数组结果无意义;返回值≥0表示命中并给出真实下标,=0;子区间查找为左闭右开,四参数版本返回原数组绝对索引;重复元素只返回任一匹配位置,降序需显式传comparator,频繁变更数据应选treeset/treemap。

Arrays.binarySearch 不是万能搜索函数,它只在数组已严格升序(或按指定 Comparator 有序)时才可靠;查到返回非负索引,查不到返回负值,其绝对值减 1 就是应插入的位置。
必须先排序,且不能跳过校验
binarySearch 不检查也不修正顺序。传入 {7, 2, 9, 4} 这样的乱序数组,结果毫无意义——可能返回 -1、-3,甚至偶尔返回 0(纯属巧合)。实际使用前务必确保:
- 基本类型数组(如 int[]):调用 Arrays.sort(arr) 一次,后续可复用
- 对象数组(如 String[] 或自定义类):要么实现 Comparable,要么显式传入 Comparator
- 若数据来自外部(如数据库、API),不能假设“应该有序”,应在代码中加断言或日志验证,例如:assert isSorted(arr) : "工号数组未排序"
看懂返回值,别用 == -1 判断是否存在
返回值不是布尔标志,而是携带位置语义的整数:
- ≥ 0:表示命中,数值就是元素在原数组中的真实下标(例如返回 2,说明 key 在第 3 个位置)
- :表示未命中,插入点 = (-result) - 1(不是 -result,也不是 -result + 1)
- 常见错误写法:if (index == -1) —— 这会漏掉所有插入点为 0 的情况(此时返回 -1),也误判插入点为 4 时返回的 -5
- 正确判断存在性只有一种:if (index >= 0)
查子区间要懂 [from, to) 的边界规则
四参数版本 Arrays.binarySearch(arr, from, to, key) 搜索的是左闭右开区间:
- from 包含,to 不包含(即实际查索引 from 到 to-1)
- 若想查前 100 个元素,写 binarySearch(arr, 0, 100, key),不是 binarySearch(arr, 0, 99, key)
- 插入点计算基于该子区间:key 小于区间所有元素 → 返回 -(from + 1);大于所有 → 返回 -(to + 1)
- 返回的索引仍是原数组中的绝对位置,不是子区间的相对偏移
处理重复、前缀、多结果等进阶场景
binarySearch 本身不保证返回首个或末个匹配项,也不支持模糊匹配,但可借其插入点逻辑拓展使用:
-
找全部重复项:先 binarySearch 定位一个位置,再向左右线性扫描相等元素;高频需求建议改用 TreeMultiset 或预建 Map
> - 前缀匹配(如查“app”是否为单词前缀):利用插入点,检查该位置及前一位置的字符串是否以查询串开头(需数组升序、大小写统一)
- 降序数组:不能直接用,须传入 Collections.reverseOrder() 作为 Comparator
- 频繁增删的数据:binarySearch + sort 维护成本高,优先选 TreeSet 或 TreeMap











