二分查找仅适用于已排序且支持随机访问的List(如ArrayList),时间复杂度O(log n),10⁶元素最多20次比较;未排序或用错Comparator会导致结果错误;查无结果时返回-(insertionIndex)-1,可直接用于插入定位。

因为二分法在有序 List 中能把查找次数压缩到对数级,100 万个元素最多比较 20 次,远快于逐个扫描的线性查找。
前提:必须是已排序的随机访问列表
binarySearch 只对 已排序 且支持随机访问的 List(如 ArrayList)有效。它不检查排序状态,也不适配 LinkedList——后者每次取中间元素需遍历,时间复杂度退化为 O(n),完全失去二分优势。
常见错误是直接对未排序的 list 调用,结果不可预测。务必先调用 Collections.sort(list) 或按指定 Comparator 排序。
时间复杂度稳定在 O(log n)
每次比较后,搜索范围精确减半。无论目标在开头、中间还是末尾,最坏情况也只需 ⌊log₂n⌋ + 1 次比较。
- 10⁶ 元素 → 最多 20 次比较
- 10⁹ 元素 → 最多 30 次比较
- 相比线性查找平均 n/2 次,提升极为显著
插入点信息自带实用逻辑
查不到时返回负值 -(insertionIndex) - 1,不是随便设计的。这个值可直接转为应插入的位置索引,省去额外定位步骤。
例如返回 -4,说明该元素应放在索引 3 的位置;结合 list.add(-result - 1, target) 就能维持列表持续有序,适合构建有序缓存或优先队列场景。
Comparator 必须严格一致
排序用了自定义比较器,查找时也必须传同一个——哪怕只是字符串长度、日期先后、或逆序逻辑。否则比较规则错位,mid 判定失准,结果必然错误。
升序排完却用降序 Comparator 去查,等同于在乱序数据上硬套二分,结果毫无意义。

















