Arrays.binarySearch 高效应用指南

夏丽姑娘_9431

夏丽姑娘_9431

2026-07-02

527人浏览

原创

arrays.binarysearch是java中专为已排序升序数组设计的o(log n)查找工具,返回值≥0表示找到并给出下标,

arrays.binarysearch 高效应用指南

Arrays.binarySearch 是 Java 中唯一专为已排序数组设计的 O(log n) 查找工具,不是通用搜索函数,也不是自动排序器。用对场景,它比遍历快百倍;用错前提,结果完全不可信。

必须先排序,且只认升序

binarySearch 不检查数组是否有序,也不做任何排序。传入未排序数组,返回值无逻辑可言——可能碰巧是正数(误判存在),也可能返回任意负数(插入点失效)。

  • 基础类型数组:调用 Arrays.sort(arr) 一次即可,后续所有查找复用
  • 不想改原数组?用 arr.clone() 复制后再排序
  • 降序需求?不能直接用,要显式传 Comparator,例如 Collections.reverseOrder()
  • 开发阶段建议加简单校验:for (int i = 1; i

读懂返回值:索引和插入点是一体两面

返回值不是布尔量,而是携带位置语义的整数:

智绘设计
智绘设计

智绘设计是一款AI图像与设计工具,腾讯推出的智能设计平台,让内容更精彩。

下载
  • ≥ 0:找到,数值就是元素在数组中的实际下标(从 0 开始)
  • :未找到,此时 -(返回值 + 1) 就是插入点索引
  • 例如返回 -4 → 插入点是 3;返回 -1 → 插入点是 0;返回 -7(数组长为 6)→ 插入点是 6(末尾)
  • 判断“是否存在”必须写 result >= 0,别用 != -1 —— 那只是插入点为 0 的一种情况

实用场景不止是“找得到吗”

利用插入点信息,能做不少轻量级数据操作:

  • 快速分档定位:比如已排序的响应时间分位点 [50, 120, 280, 550],查 200ms 耗时返回 -3 → 插入点是 2 → 属于第 2–3 档之间
  • 维护有序缓存:调用后得插入点,再用 System.arraycopy 移位插入,比遍历找位置快得多
  • 区间计数:查下界值的插入点 A 和上界值的插入点 B,差值 B - A 就是该区间内元素个数
  • 去重统计:先排序,再用 binarySearch 找到某值位置,向左/右线性探查边界,算出重复次数

避开高频陷阱

这些错误看似低级,但上线后极难排查:

  • 混用数组类型:int[] 不能传给 Object[] 版本,编译可能通过但运行逻辑崩溃
  • null 值雷区:对象数组含 null,又没用 null-safe Comparator,直接抛 NullPointerException
  • 浮点数 NaN:NaN 不参与有效比较,排序和查找都会出问题
  • 误用于 List:ArrayList 要用 Collections.binarySearch(list, key);LinkedList 效率极低,不建议
  • 动态数据硬套:频繁增删就别用数组+binarySearch,改用 TreeSet 或 TreeMap 更稳妥

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9857

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7002

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6172

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1064

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

888

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1296

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2589

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19911

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1155

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习