arrays.binarysearch的时间复杂度是o(log n),因其每次比较将搜索范围减半,最多执行⌊log₂n⌋+1次比较;但前提是数组必须已排序,否则结果不可靠,且预排序会带来o(n log n)开销。

Arrays.binarySearch 的时间复杂度是 O(log n),前提是输入数组必须已排序;它不改变原数组,也不处理无序或动态更新场景。
时间复杂度为什么是 O(log n)
每次比较都将搜索范围砍掉一半:从 n 个元素开始,第一次剩 n/2,第二次剩 n/4,依此类推,直到剩下 1 个或搜索区间为空。总共最多执行 ⌊log₂n⌋ + 1 次比较。这个增长速率远低于线性查找的 O(n),尤其在百万级数据中优势明显——比如 100 万个元素,最多只需约 20 次比较就能定位或确认不存在。
注意:该复杂度仅反映查找过程本身。若数组未排序,先调用 Arrays.sort() 会带来 O(n log n) 的预处理开销,整体效率反而不如线性扫描。
Arrays.binarySearch 的实际行为细节
- 返回值 ≥ 0 表示找到,值即为目标元素的索引
- 返回值
- 对重复元素,不保证返回哪一个——可能返回任意一个匹配项的索引,不一定是第一个或最后一个
- 仅支持基本类型数组(如 int[])和对象数组(要求元素实现 Comparable 或传入 Comparator)
常见误用与规避建议
- 直接对未排序数组调用 → 结果不可预测,必须先确保有序
- 期望获取重复元素的左边界或右边界 → 应改用自定义二分变体(如 lowerBound / upperBound)
- 在频繁增删的集合中反复调用 → 数组不适合动态场景,考虑 TreeSet 或 TreeMap
- 忽略负数返回值含义 → 可利用插入点信息做有序插入、去重合并等操作
一个实用小技巧:用 binarySearch 实现有序插入
当需要把新值插入到已排序数组并维持顺序时,可借助返回值:
若 result ≥ 0,说明已存在,无需插入;
若 result
虽然 Java 数组本身不可扩容,但该逻辑常用于 ArrayList(配合 Collections.binarySearch + add(index, e))或构建有序缓存结构。











