binarysearch 必须与排序使用同一比较规则:升序用自然序,降序或自定义规则时排序和查找均需传相同comparator;返回值≥0表示找到,否则-(result+1)为插入点;浮点数和null需用专用comparator处理。

确认排序顺序与 binarySearch 用法严格匹配
Arrays.binarySearch 不验证数组是否有序,只按你声明的顺序执行查找。如果你用 Arrays.sort(arr, Comparator.reverseOrder()) 降序排了数组,却调用无 Comparator 的 binarySearch(arr, key),结果必然错误——它仍按升序逻辑找,会跳过真实位置或返回无效负值。
正确做法是:排序和查找必须使用同一套比较规则。
- 升序自然序:先
Arrays.sort(arr),再Arrays.binarySearch(arr, key) - 降序查找:先
Arrays.sort(arr, Comparator.reverseOrder()),再用Arrays.binarySearch(arr, key, Comparator.reverseOrder()) - 自定义规则(如按字符串长度):排序和查找都传同一个
Comparator.comparing(String::length)
设计可复现的正确性测试用例
不要只测“找到了”和“没找到”两种情况。一个健壮的测试应覆盖边界、插入点还原、重复元素和空数组。
- 查存在元素:确认返回索引 ≥ 0,且
arr[index] == key - 查不存在元素:验证
-(result + 1)确实等于该值在升序中应插入的位置(比如数组{1,5,9}中查7,应得-3,插入点为2) - 查重复元素:binarySearch 不保证返回第一个或最后一个,但返回值必须 ≥ 0 且落在合法索引范围内
- 查边界值:key 小于最小值 → 插入点为 0;key 大于最大值 → 插入点为
arr.length
避免常见误判逻辑
返回值不是布尔标识,index == -1 不能代表“未找到”。例如在 {2,4,6} 中查 1,返回 -1,表示插入点为 0;而查 3 返回 -2,插入点才是 1。
标准判断写法唯一可靠:
int idx = Arrays.binarySearch(arr, key);
if (idx >= 0) {
// 找到,使用 arr[idx]
} else {
int insertionPoint = -(idx + 1);
// insertionPoint 是维持升序所需的插入位置
}
对浮点数和 null 元素做专项校验
double[] 或 float[] 数组中含 NaN 或 ±0 时,排序和比较行为异常。Java 的 Double.compare() 和 Float.compare() 才能正确处理这些值。
- 排序时用
Arrays.sort(arr, Double::compare)而非默认Arrays.sort(arr) - 查找时同样传入相同 comparator:
Arrays.binarySearch(arr, target, Double::compare) - 对象数组含
null:若 comparator 不支持 null(如String::compareTo),需改用Comparator.nullsFirst(Comparator.naturalOrder())并确保排序和查找一致











