arrays.binarysearch要求数组必须已排序,否则结果不可靠;返回值≥0为找到的索引,

Java中用Arrays.binarySearch查找元素,核心就三点:数组必须已排序、方法返回索引或插入点、支持多种类型和范围。
必须先排序,否则结果不可靠
binarySearch不是万能搜索器,它只对有序数组有效。如果直接在乱序数组上调用,返回值完全无法预测——可能错位、可能负得离谱,甚至看似“找到了”实则位置错误。
正确做法是调用前先排序:
- 基本类型数组:用
Arrays.sort(arr) - 字符串或对象数组:同样先
Arrays.sort(arr),确保按自然顺序排好 - 自定义对象:类需实现
Comparable,或传入Comparator(比如忽略大小写查字符串)
看懂返回值:正数是索引,负数是插入点编码
返回值不是简单的“找到/没找到”,而是带语义的整数:
- ≥ 0:表示找到了,数值就是该元素在数组中的下标(从0开始)
- -(返回值) - 1
例如返回 -4,说明应插在索引 3 的位置(因为 -(-4) - 1 = 3);返回 -1,说明应插在开头(索引 0)。
支持指定范围查找,适合分段处理
不需要每次都搜整个数组。可以用四参数重载版本限定区间:
Arrays.binarySearch(arr, fromIndex, toIndex, key)
- 区间是左闭右开:
[fromIndex, toIndex) -
toIndex不能越界,否则抛ArrayIndexOutOfBoundsException - 示例:在
{1,2,3,4,5,6}中查 3,范围设为(1,4),即只查{2,3,4},返回值仍是原数组索引 2
覆盖所有常见类型,包括对象和自定义类
不仅支持int[]、double[]、char[]等基本类型数组,也支持:
-
String[]:需先排序,再查,区分大小写(可用String.CASE_INSENSITIVE_ORDER) - 自定义对象数组:如
Person[],必须保证排序和查找时使用的比较逻辑一致(同个Comparator) - 注意:有重复元素时,不保证返回哪一个,只保证返回其中一个匹配项的索引
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











