大家好,我是雄雄,今天我们来看看java中的binarySearch方法

我们都知道,如果我们想要在一个集合中查找某个元素所在的位置时,可以使用list类自带的indexOf方法,简单方便还快捷。不过,Collections类也给我提供了个查找集合中元素的方法——binarySearch,但是这个方法和indexOf方法无论从检索原理还是返回值上来说,都有很大的差距!

01

IndexOf方法

我们先来看看indexOf是怎么检索集合内元素的,示例代码如下:

public static void main(String[] args) {Listlists = new ArrayList();lists.add(3);lists.add(6);lists.add(8);lists.add(7);lists.add(1);System.out.println("集合中的元素:");for (Integer str : lists) {System.out.print(str+" ");}int index = lists.indexOf(2);System.out.println("\n2所在的位置是:"+index);}

其运行结果:

下面我们再来查找一下“8”所在的位置,稍微改一下代码:

int index = lists.indexOf(8);

其运行结果如下:

两个案例说明不了问题,我们再来一个,比如查找一下“4”

这下很清楚,使用indexOf方法查找集合中的元素,简单方便,如果有,返回该元素的下标(下标从0开始),如果没有,则返回的是-1。

02

binarySearch方法

binarySearch方法采用二分法的方式来对集合元素进行检索,二分法搜索说的简单点,就是“折半折半再折半”!简单,而且在效率方面要比idnexOf的方法要高出不少!下面我们就来看看binarySearch方法是如何检索数据的。

首先,需要说明的是,使用binarySearch方法检索(二分法)的前提是要对集合内数据进行排序,否则返回的值是不准确的!要是不排序,怎么能知道值是在比中间值小的区域或者比中间值大的区域呢?

下面我们使用代码来看看:

public static void main(String[] args) {Listlists = new ArrayList();lists.add(3);lists.add(6);lists.add(8);lists.add(7);lists.add(1);// 原来的集合System.out.println("原来的集合:");for (Integer str : lists) {System.out.print(str + " ");}// 对集合进行排序Collections.sort(lists);System.out.println("\n排序后的集合:");for (Integer str : lists) {System.out.print(str + " ");}// 使用binarySearch方法查找集合中的元素int i = Collections.binarySearch(lists, 2);System.out.println("\n2所在的位置:" + i);}

代码分析:集合还是原来的集合,只是我们将集合进行了简单的升序,然后使用binarySearch方法查找集合中“2”所在的位置,indexOf方法返回的是-1,那binarySearch方法呢?

运行结果如下:

居然是-2,结果我们先保留着,我们在继续举例!如果查找“8”呢,结果如下:

结果是4,那我们在继续查找“4”所在的位置,其结果如下所示:

好了,到这里已经差不多可以总结了,有同学可能会说:“老师,这没有规律的一些返回值,怎么总结?”别着急,我们挨个来看!

01

分析1:查找“2”时,显然集合中没有“2”,所以必然找不到,但是返回值-2又改怎么解释呢?大家注意看,2如果有的话,应该在哪个位置?是不是在3的位置(排序后),大于1小于3,那3所在的位置和“-2”有何关联吗?当你把整个集合的下标设成从1开始,3所在的位置即2,因为没有“2”这个元素,所以返回值就是“-2”。

02

分析2:查找“8”时,集合中是存在的,返回值是4,大家把现在“8”的位置和返回值4进行关联,总结一下是什么?那就是,当集合中存在该数时,下标是从0开始的,并且值是正数。

03

分析3:带着分析1的结论,我们来验证一下查找“4”。集合中是不存在4的,那如果有的话,“4”应该在6的位置,那下标从1开始,“6”所在的位置就是3,又因为集合中没有,所以是负数!

以上就是关于indexOf和binarySearch方法的总结,是不是庆幸自己又学会了一点啦!

往期精彩

新机必装!那些你不知道的实用技软件在这里!文末免费获取

2020-10-31

自从有了这款辣椒酱,拌饭再也不用老干妈

2020-10-30

如何使用bootstrap实现轮播图?

2020-10-29

班级日常分享:一天一瞬间!

2020-10-29

中流击水,浪遏飞舟

2020-10-28

王宝兴:秋运会

2020-10-27

高启航:秋运会!

2020-10-26

点分享

点点赞

点在看

binarySearch与IndexOf的那些事儿~相关推荐

  1. 今天 ,给大家变个魔术!!!

    前言:在对网页进行布局时,当我们设置div的的宽为固定宽时,理论上,内容是不会超出div的,那你有没有见过内容超出div固定宽度的情况呢?今天我们就来看看到底是怎么一回事? 看分析之前,我们先看一下效 ...

  2. 集合还有这么优雅的运算法?

    前言:在初中数学,我们也有集合的概念,非但如此,还有集合中的一些运算,例如交集.并集.差集等,那么我们java中的集合是否有这样的运算呢?今天我们就一起来看看! 01 并集 就是将两个集合合起来,元素 ...

  3. 使用相对长度单位rem布局网页内容

    前言:上篇我们提到了相对单位em的用法,知道了em的概念,即是一个相对的单位,也知道了em的值不是固定的,p标签里的em和p里面的div下面的1em的px值并不是一样的.具体是多少呢?那就得看一下父级 ...

  4. 使用相对长度单位em布局网页内容

    顺便问一下哈?那个辣椒酱大家感觉怎么样,你们也买了也尝了,是不是该反馈反馈啦~~如果还有想要的,可以联系我呐! 原文地址:自从有了这款辣椒酱,拌饭再也不用老干妈 前言:在页面开发中,页面元素的尺寸大小 ...

  5. em表示什么长度单位_使用相对长度单位em布局网页内容

    顺便问一下哈?那个辣椒酱大家感觉怎么样,你们也买了也尝了,是不是该反馈反馈啦~~如果还有想要的,可以联系我呐!原文地址:自从有了这款辣椒酱,拌饭再也不用老干妈 前言:在页面开发中,页面元素的尺寸大小和 ...

  6. indexOf和binarySearch的对比

    2019独角兽企业重金招聘Python工程师标准>>> 在对一个列表进行检索的时候,我们经常使用的是indexOf方法进行检索,而Collections工具类也提供了一个检索的方法b ...

  7. [改善Java代码]不推荐使用binarySearch对列表进行检索

    对一个列表进行检索时,我们使用的最多的是indexOf方法,它简单好用,而且也不会出错,虽然它只能检索到第一个符合条件的值,但是我们可以生成子列表后再检索.这样也就可以查找到所有符合条件的值了. Co ...

  8. 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》

    文章目录 0.前言 1.功能 2.示例 有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来 ① 实现原理 ② 实现代码 ③ 性能分析 0. ...

  9. Java中的binarySearch方法

    大家好,我是雄雄,今天我们来看看java中的binarySearch方法! 前言:我们都知道,如果我们想要在一个集合中查找某个元素所在的位置时,可以使用list类自带的indexOf方法,简单方便还快 ...

最新文章

  1. 机器都会学习了,你的神经网络还跑不动?来看看这些建议
  2. C# CreateParams的使用(解决闪屏问题)
  3. 一个命令kill所有符合条件的进程
  4. 网络协议之:还在用HTTP代理?过时了,快试试SOCKS5
  5. 对比 C++ 和 Python,谈谈指针与引用
  6. [振动力学] 课程考核报告:Matlab 实现邓克利法、瑞利法、里兹法、矩阵迭代法
  7. pytorch构造IterableDataset,流式读取文件夹,文件夹下所有大数据文件,逐个文件!逐行读取!(pytorch Data学习四)
  8. 苹果2019款iPad新机曝光:后置浴霸三摄
  9. linux 按列提取文件名,Linux展示按文件名降序文件
  10. 算法:判断对称树 101. Symmetric Tree
  11. MSN蠕虫Myalbum2007.zip专杀工具
  12. Linux超详细指令及其解析
  13. 不卷了!技术团队成员集体辞职
  14. 特定软件无法联网,nslookup无法解析任何地址,但是其他业务工作正常的故障...
  15. 微程序控制及微程序设计实验报告
  16. 【考研加油】所有上岸的考研人都有一个共同的特点,就是他们都参加考试了。2023考研加油。
  17. 阿里云人工智能pai云计算平台使用方法
  18. java开发平板_用Android平板来写代码 - Termux 环境搭建
  19. Unity游戏开发——向量运算(点乘和叉乘)
  20. 锐捷交换机删除vlan

热门文章

  1. [蓝桥杯2016决赛]七星填数-next_permutation枚举
  2. 洛谷P2884 [USACO07MAR]Monthly Expense S
  3. java进阶之注解篇
  4. 2021年度训练联盟热身训练赛第五场 H题In-place Sorting+贪心构造
  5. 如何看云服务器性能,从存储速度看云服务器性能测试
  6. cg word List 3
  7. word List 05
  8. CF 1475 D. Cleaning the Phone 思维模型
  9. Codeforces Round #556 (Div. 1Div. 2)
  10. [TJOI2017]城市(未解决)