二分法查找的核心优势是将搜索次数压缩至对数级,100 万个元素最多仅需 20 次比较;它要求数据有序且支持随机访问,故适用于 ArrayList 而不适用于 LinkedList;使用自定义 Comparator 时必须保持排序与查找逻辑一致;查不到时返回的负值可直接换算为插入位置,便于维护动态有序列表。
二分法查找的核心优势在于它能把搜索次数压缩到对数级,100 万个元素最多只需 20 次比较,远快于线性扫描。
binarySearch 要求数据必须已排序,且底层必须支持 O(1) 时间定位中间元素——所以 ArrayList 可以,LinkedList 不行。后者每次取 mid 都得从头遍历,时间复杂度退化成 O(n),二分就失去了意义。
线性查找平均要检查一半元素,最坏情况得比对全部 n 个;二分查找每次砍掉一半范围,10⁶ 元素最多 20 次,10⁹ 元素也才约 30 次。这种差距在真实业务中直接体现为响应延迟的大幅下降。
返回负值不是随便设计的:-4 表示目标应插入索引 3 的位置。这个 insertionIndex 可直接用于 list.add(-result - 1, target),无需额外遍历或重写逻辑,特别适合维护动态有序缓存或构建轻量级优先队列。
不复杂但容易忽略细节