0Pricing
Java Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Arrays.sort 与排序
  2. Arrays.binarySearch
  3. Arrays.fill 与 copyOf
  4. Arrays.equals 与 toString
← 返回 Java Academy