导读:本期聚焦于小伙伴创作的《如何在 Java 中使用 Arrays.binarySearch() 在有序数组中极速定位特定业务主键的索引》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在 Java 中使用 Arrays.binarySearch() 在有序数组中极速定位特定业务主键的索引》有用,将其分享出去将是对创作者最好的鼓励。

在Java开发中,业务系统经常会把用户ID、订单编号这类业务主键存储在有序数组中,当需要查询某个主键对应的索引时,如果采用线性遍历的方式,时间复杂度是O(n),数据量大的时候性能会明显下降。而Arrays类的binarySearch()方法基于二分查找实现,时间复杂度仅为O(log n),能够快速完成定位。

如何在 Java 中使用 Arrays.binarySearch() 在有序数组中极速定位特定业务主键的索引

Arrays.binarySearch() 基本使用规则

该方法属于java.util.Arrays类,是静态方法,调用时不需要创建Arrays实例。它有两个常用的重载形式,分别用于查找基本类型数组和对象数组中的目标元素。

查找基本类型有序数组

对于int、long、double等基本类型的数组,要求数组必须是升序排列的,否则查找结果是不确定的。方法签名如下:

public static int binarySearch(int[] a, int key)

其中a是待查找的有序数组,key是要查找的目标业务主键,返回值是目标元素的索引,如果没找到则返回负数。

查找对象类型有序数组

对于对象数组,数组中的元素必须实现了Comparable接口,并且按照自然升序排列,或者调用带Comparator参数的重载方法,按照指定的比较规则升序排列。方法签名如下:

public static int binarySearch(T[] a, T key, Comparator<? super T> c)

业务主键查找代码示例

下面以用户ID这个业务主键为例,演示如何在有序的int数组中查找目标ID的索引:

import java.util.Arrays;

public class BinarySearchDemo {
    public static void main(String[] args) {
        // 模拟存储用户ID的有序数组,假设已经按升序排列
        int[] userIds = {1001, 1003, 1005, 1007, 1009, 1011};
        // 要查找的目标业务主键
        int targetUserId = 1007;
        
        // 调用Arrays.binarySearch()查找索引
        int index = Arrays.binarySearch(userIds, targetUserId);
        
        if (index >= 0) {
            System.out.println("业务主键" + targetUserId + "的索引为:" + index);
        } else {
            // 没找到时的返回值处理
            System.out.println("业务主键" + targetUserId + "不存在,插入点索引为:" + (-index -1));
        }
    }
}

上述代码中,userIds数组是升序排列的用户ID集合,调用binarySearch方法查找1007,最终会返回索引3,符合预期结果。

返回值含义解析

Arrays.binarySearch()的返回值有两类情况:

  • 如果数组中包含目标业务主键,返回该主键在数组中的索引,索引从0开始计数。
  • 如果数组中不包含目标业务主键,返回一个负数,这个负数的绝对值减1,就是该主键如果插入数组时应该放置的位置索引,也就是插入点。

比如上面的例子中,如果查找1006,数组中没有这个元素,返回的会是-4,因为1006应该插入到索引3的位置,符合(-(-4)-1)=3的计算逻辑。

使用注意事项

在使用该方法查找业务主键时,需要注意以下几点:

  • 待查找的数组必须是升序排列的,如果数组是降序或者无序的,查找结果没有意义,可能返回错误的索引或者找不到存在的元素。
  • 如果数组中有多个相同的业务主键,方法不能保证返回的是第一个还是最后一个匹配的索引,只会返回其中一个存在的索引。
  • 对于对象数组的查找,如果使用自定义比较器,必须保证比较器的规则和数组的排序规则一致,否则会出现查找错误。
  • 该方法只适用于数组结构,如果存储业务主键的是List集合,需要先转换为数组,或者使用Collections.binarySearch()方法。

性能对比

我们可以通过简单的测试对比线性查找和二分查找的性能差异,假设有序数组长度为100000,查找位于数组末尾的元素:

import java.util.Arrays;

public class PerformanceTest {
    public static void main(String[] args) {
        int[] arr = new int[100000];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i * 2;
        }
        int target = 199998;
        
        // 线性查找测试
        long start1 = System.nanoTime();
        int linearIndex = -1;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == target) {
                linearIndex = i;
                break;
            }
        }
        long end1 = System.nanoTime();
        System.out.println("线性查找耗时:" + (end1 - start1) + "纳秒");
        
        // 二分查找测试
        long start2 = System.nanoTime();
        int binaryIndex = Arrays.binarySearch(arr, target);
        long end2 = System.nanoTime();
        System.out.println("二分查找耗时:" + (end2 - start2) + "纳秒");
    }
}

实际运行时可以看到,二分查找的耗时远远低于线性查找,数据量越大,性能差距越明显,这也体现了使用Arrays.binarySearch()在有序数组中定位业务主键的优势。

JavaArrays_binarySearch有序数组二分查找业务主键修改时间:2026-06-12 15:33:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。