Arrays.binarySearch
搜索已排序数组
Arrays.binarySearch 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
搜索已排序的数组
Arrays.binarySearch 可以在已排序的数组中以 O(log n) 的时间复杂度查找元素。它会反复将搜索范围减半,因此比扫描每个元素快得多。
已排序这一前提
数组必须已经按升序排序。如果没有排序,结果将未定义。如果不确定,请始终先使用 Arrays.sort。
基本搜索
找到值后,binarySearch 会返回它的索引。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 8, 10};
int index = Arrays.binarySearch(nums, 8);
System.out.println("Found at index " + index);
}
}找不到值时
如果不存在该值,返回值将为负数:它等于 -(insertionPoint) - 1。插入点是为了保持数组有序,该值应当插入的位置。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 8, 10};
int result = Arrays.binarySearch(nums, 5);
System.out.println("Raw result: " + result);
}
}还原插入点
要将负数结果转换为插入索引,请计算 -(result) - 1。这会告诉您缺失值应插入的位置。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 8, 10};
int result = Arrays.binarySearch(nums, 5);
if (result < 0) {
int insertionPoint = -(result) - 1;
System.out.println("Would insert at index " + insertionPoint);
}
}
}搜索对象数组
binarySearch 也可以使用自然顺序搜索对象数组。数组必须按照搜索所使用的相同比较方式进行排序。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] names = {"Alice", "Bob", "Charlie", "Dave"};
int index = Arrays.binarySearch(names, "Charlie");
System.out.println("Charlie at index " + index);
}
}使用比较器进行搜索
如果数组使用自定义 Comparator 排序,则必须将同一个 Comparator 传给 binarySearch,否则结果没有意义。
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
String[] names = {"Dave", "Charlie", "Bob", "Alice"};
Comparator<String> desc = Comparator.reverseOrder();
Arrays.sort(names, desc);
int index = Arrays.binarySearch(names, "Charlie", desc);
System.out.println("Index: " + index);
}
}搜索指定范围
您可以使用 binarySearch(array, fromIndex, toIndex, key) 将搜索限制在数组的一部分。范围边界遵循与 sort 相同的包含起点、不包含终点规则。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 8, 10, 12};
int index = Arrays.binarySearch(nums, 1, 5, 8);
System.out.println("Index: " + index);
}
}重复值的结果未指定
如果数组包含重复值,则无法保证返回哪一个匹配索引。二分查找最适合用于键唯一的数组。
为什么不直接循环
线性扫描的时间复杂度为 O(n),可以处理未排序的数据。二分查找的时间复杂度为 O(log n),但要求数据已排序。对于大型数据集上的重复查找,排序一次后进行多次二分查找会带来显著收益。
整合应用
先排序,再搜索,并安全地解读结果。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] ids = {40, 10, 30, 20};
Arrays.sort(ids);
int r = Arrays.binarySearch(ids, 30);
if (r >= 0) {
System.out.println("Found 30 at index " + r);
} else {
System.out.println("Not found; insert at " + (-(r) - 1));
}
}
}快速检查
测试您对 binarySearch 的理解。
回顾
您已经学会了使用 Arrays.binarySearch 快速搜索。
- 数组必须先排序。
- 非负结果表示找到的索引。
- 负数结果会将插入点编码为
-(result) - 1。 - 排序和搜索必须使用同一个 Comparator。
常见问题解答
「Arrays.binarySearch」课时是免费的吗?
是的 — 「Arrays.binarySearch」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「Arrays.binarySearch」这节课中我会学到什么?
搜索已排序数组 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「Arrays.binarySearch」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Arrays.sort 与排序
- Arrays.binarySearch
- Arrays.fill 与 copyOf
- Arrays.equals 与 toString