Collections.binarySearch专为有序List设计,要求List严格升序且元素可比较,返回索引或负数插入点(|返回值|−1),不适用于无序集合或数组;Arrays.binarySearch才用于数组。
Java 中 Collections.binarySearch 是专为有序 List 设计的高效查找方法,它不适用于无序集合,也不直接操作数组(数组要用 Arrays.binarySearch)。它的核心价值在于复用标准库逻辑,避免手写边界错误,但返回值含义需特别注意——找到时返回索引,没找到时返回负数插入点,不是简单返回 -1。
调用前务必确认两点:
IllegalArgumentException(某些实现会检测并报错)Comparable 接口且类型一致,要么传入兼容的 Comparator
返回值不是“是否找到”的布尔标志,而是带信息的整数:
这个设计让开发者既能判断存在性,又能快速获取插入位置,适合维护有序列表的场景。
立即学习“Java免费学习笔记(深入)”;
最常见的是带 Comparator 的重载,尤其当 List 元素类型未实现 Comparable 或需自定义排序逻辑时:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");Collections.sort(names); // 确保有序int pos = Collections.binarySearch(names, "Bob"); // 返回 1List<Integer> nums = Arrays.asList(10, 20, 30, 40);int idx = Collections.binarySearch(nums, 25, Integer::compareTo); // 返回 -3(插入点为索引 2)
别混淆这两个方法:
Collections.binarySearch(List, ...):只接受 List,底层依赖 get(int) 随机访问,对 LinkedList 效率极低(O(n log n)),推荐仅用于 ArrayList
Arrays.binarySearch(...):专用于数组,无论 int[] 还是 Object[],都直接按内存地址访问,稳定 O(log n)如果手头是数组,不要先转成 Arrays.asList() 再调用 Collections 方法——这会创建包装 List,且对基本类型数组无效(会变成装箱对象数组),徒增开销和风险。