Arrays.binarySearch 是 Java 中用于在已排序升序数组中执行二分查找的方法,返回目标索引(≥0)或 -(插入点+1)(<0),前提是数组必须已升序排列,否则结果不可靠。

Arrays.binarySearch 是 Java 提供的高效查找工具,但它本身不是“实现查找算法”的过程,而是直接调用已封装好的二分查找逻辑。你不能基于它“重新实现”二分查找(那会违背封装初衷),但可以**正确使用它、理解其前提与边界,并在合适场景中扩展或组合使用**。
必须确保数组已排序
binarySearch 只对**升序排列的数组**保证结果正确。如果数组无序,返回值无意义(可能为负数,也可能偶然命中,但不可靠)。
- 升序排序后才能用:Arrays.sort(arr);若原数组需保持原序,应复制后再排序
- 降序数组不能直接用——可改用带 Comparator 的重载版本,例如:
Arrays.binarySearch(arr, key, Collections.reverseOrder()) - 自定义类型必须实现 Comparable,或传入显式 Comparator
理解返回值含义
返回值不是简单的 true/false,而是具有明确语义的整数:
- ≥ 0:表示找到元素,值为该元素在数组中的索引
- < 0:表示未找到,其值为
-(插入点) - 1,插入点即该 key 应插入的位置(维持升序) - 例如数组 [1,3,5,7] 中查找 4,返回 -3(因为 4 应插在索引 2 处,-(2)-1 = -3)
处理重复元素要小心
binarySearch 不保证返回哪一个重复元素的位置,只保证返回“某个存在的位置”。如果需要最左/最右位置,不能依赖它:
- 找最左下标:需手写二分(low 指针向右收缩时不跳过相等元素)
- 找最右下标:同样需定制逻辑(high 指针向左收缩时保留相等元素)
- 也可先用 binarySearch 确认存在,再线性向左右扩展——适合重复极少的场景
替代方案与适用边界
binarySearch 仅适用于随机访问的有序数组。以下情况不适合:
- 数据在 List(尤其是 LinkedList)中:get(i) 时间非 O(1),应转成数组或改用 TreeSet / TreeMap
- 频繁增删的数据集:每次增删后排序成本高,优先考虑 TreeSet(自动维护有序+O(log n) 查找)
- 需要范围查询(如查找所有 [a,b] 区间内的元素):binarySearch 只能定位单点,建议用 TreeMap.subMap 或自行二分确定边界

















