arrays.binarysearch仅适用于已排序数组,返回值≥0表示找到并给出索引,

Arrays.binarySearch 不是“一调就快”,而是“前提全对,才真快”。它不做排序、不验顺序、不处理 null、不兼容动态结构——只在你把数组排好、类型对齐、边界理清之后,用 O(log n) 给出一个带语义的整数返回值。
必须提前升序排序,且不能靠“看起来有序”
binarySearch 不检查数组是否有序。哪怕只有一个元素位置错乱,结果就不可信:可能返回错误正索引(误判存在),也可能给出无效插入点(负数无规律)。
- 基础类型数组(如 int[]):务必先调用 Arrays.sort(arr),再查;重复查找无需重排
- 对象数组(如 String[]):元素需实现 Comparable,或每次传入**同一个** Comparator 实例
- 工号、分位点等业务数组:排序应在数据源头完成(如 DAO 层 ORDER BY),而非每次检索前现场 sort
返回值要按规则解读,别当布尔值用
返回值不是“找到了 / 没找到”的开关,而是编码了位置信息的整数:
- ≥ 0:表示 key 存在,值就是它在数组中的确切下标(例如返回 3 → 第 4 个元素匹配)
- :表示未找到,插入点 = -(result + 1)(例如返回 -4 → 应插在索引 3 的位置)
- 判断是否存在,唯一安全写法是 if (index >= 0),绝不能写
index != -1
别在错误结构上硬套,小心反向降速
binarySearch 只对随机访问高效的数组有效。它依赖 O(1) 的 get(i),而 LinkedList、某些包装类集合或非 RandomAccess List 都不适用。
- ArrayList 可用 Collections.binarySearch,但前提是已排序且不频繁增删
- LinkedList 上调用 Collections.binarySearch,实际性能可能比线性扫描还慢 10 倍
- 高频变动+需查找场景,优先选 TreeSet 或 TreeMap——自动维护有序,O(log n) 查找+插入
- int[] 比 Integer[] 更稳更快:避免自动装箱、null 异常、内存碎片
多个匹配项?binarySearch 本身不支持
它只返回“其中一个”匹配位置,无法保证是首/末/中间。想获取全部索引,得靠辅助逻辑:
- 先 binarySearch 找到任一位置,再向左右线性扩展(适合重复少、数组不大)
- 更高效做法:手写两次二分,分别找左边界(首个 ≥ key)和右边界(首个 > key),差值即数量
- 若业务频繁按值查多索引,建议改用 Map
> 或 Guava 的 TreeMultiset











