arrays.binarysearch结果正确性严格依赖排序与查找使用同一比较规则:升序排序后须用无comparator的binarysearch;自定义comparator排序后必须传相同comparator;降序需统一用collections.reverseorder();浮点数比较器不可混用;含null或未实现comparable的类须显式提供comparator;子区间查找仅要求该区间有序,返回索引为原数组绝对位置;int[]与integer[]比较规则不可互换。

Arrays.binarySearch 的查找结果是否正确,完全取决于它使用的比较规则是否与数组当时的排序状态严格一致。它不检查、不校验、不兼容——只信任你传给它的“已排序”这个前提。
排序和查找必须用同一套比较逻辑
二分查找每一步都靠比较结果决定搜左还是搜右,这个决策链一旦断裂,整个路径就失效。所以:
- 用
Arrays.sort(arr)升序排完,就得用Arrays.binarySearch(arr, key)查,不能换别的方法 - 用
Arrays.sort(arr, Comparator.comparing(String::length))按长度排,查时就必须传同一个 Comparator:Arrays.binarySearch(arr, key, Comparator.comparing(String::length)) - 降序排列必须显式使用
Collections.reverseOrder(),且排序和查找都得带上它,否则行为未定义 - 对浮点数,
Double.compare()和自定义绝对值比较器互不兼容:用前者排序,就不能用后者查找
对象数组特别注意 null 和 Comparable 实现
String、Integer 等已实现 Comparable,可直接自然序排序+查找。但自定义类或含 null 元素时:
- 若数组含 null,又没传 Comparator,调用 binarySearch 会抛 NullPointerException
- 自定义类未实现 Comparable,又没提供 Comparator,运行时报 ClassCastException
- Comparator 必须满足自反性、对称性、传递性;违反任一原则,插入点计算可能错乱,负数返回值失去意义
区间查找的排序要求是局部的,但索引是全局的
调用 Arrays.binarySearch(arr, from, to, key) 时:
- 只要子区间
[from, to)内部升序即可,不要求整个数组有序 - 返回的索引仍是原数组中的绝对位置,不是子区间的相对偏移
- 插入点也按该子区间重新计算:比如在
[5,7,9](对应原数组索引 2~4)中查 6,应插在子区间索引 1 → 原数组索引为 3 → 返回 -(3 + 1) = -4 - 不能假设“全局有序”就等于“任意子区间可用”——若传入的 from/to 覆盖了乱序段,结果不可靠
原始类型和包装类型不能混用比较规则
int[] 和 Integer[] 是不同重载,底层处理方式不同:
-
int[]只能用基本类型重载,不接受 Comparator;想用自定义规则,必须转成Integer[] -
Integer[]既可用自然序,也可传 Comparator,但排序和查找的 Comparator 必须完全相同 - 误把
int[]当作Object[]传,编译失败;误把Integer[]当作int[]传,也会类型不匹配 - Java 不会对整个数组自动拆箱/装箱,所以规则切换必须显式、统一、全程一致











