比较Arrays_binarySearch与手动遍历查找性能差异

千静酱_5894

千静酱_5894

2026-03-19

1022人浏览

原创

Arrays.binarySearch 仅适用于已排序数组,时间复杂度O(log n),手动遍历适用任意数组但为O(n);小数组(≤1000)遍历更快,大数组(≥10000)binarySearch优势显著;频繁查找宜用HashSet或预排序+多次binarySearch。

比较arrays_binarysearch与手动遍历查找性能差异

Arrays.binarySearch 比手动遍历快,但只适用于已排序数组;手动遍历没有前提要求,但时间复杂度高。性能差距取决于数组大小和是否有序。

适用前提决定能否用 binarySearch

Arrays.binarySearch 要求数组必须升序排列(或按指定 Comparator 排好序),否则返回结果不可靠——可能找不到、找错位置,甚至返回负数却不代表不存在。而手动遍历(for 循环)对数组是否有序完全无感,任何情况都能用。

  • 若数组原本无序,强行先调用 Arrays.sort() 再 binarySearch,总开销 ≈ O(n log n) + O(log n),通常不如直接遍历 O(n)
  • 若数组天然有序(如配置项列表、时间戳序列、预加载字典),binarySearch 才真正发挥优势

小数组 vs 大数组:性能拐点明显

实测数据表明:数组长度约 1000 是关键分界线。

  • 长度 ≤ 1000:手动遍历往往更快(例如 1000 元素时,循环平均耗时约 2–3 万纳秒,binarySearch 约 5 万纳秒)
  • 长度 ≥ 10000:binarySearch 稳定在 3–4 万纳秒量级,而遍历跃升至 90–440 万纳秒,差距达百倍
  • 长度 100 万时,binarySearch 仍保持 ~3.5 万纳秒,遍历则需超 400 万纳秒

实际写法差异影响真实性能

不是“用了 binarySearch 就一定快”,还要看怎么用。

  • 错误用法:对 String[] 直接 binarySearch 但未排序 → 结果无效,白费时间
  • 低效用法:每次查找都 new HashSet(Arrays.asList(arr)) → 创建集合开销远超查找本身
  • 推荐组合:一次排序 + 多次 binarySearch(适合反复查同一数组);或维持插入时有序,避免重复排序

替代思路:根据场景选更合适的结构

如果频繁查找且数组内容变动少,数组本身未必是最佳载体。

  • 查存在性(不关心位置):HashSet.contains() 平均 O(1),比 binarySearch 的 O(log n) 更快,且无需排序
  • 查位置且需有序:用 TreeSet 或维护一个 SortedSet,支持 log 级插入+查找
  • 查多个值:先把数组转为 Set 或 Map 建索引,后续查找都是常数时间
数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7559

3

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

2023.09.04

1158

7

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

750

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

343

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

553

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

323

6

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

100

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

60

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

60

15

热门下载

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

精品课程

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

共6课时 | 54.7万人学习

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

共89课时 | 134.3万人学习