二分查找之RandomAccess的作用

本文探讨了Java集合中基于数组的随机访问结构与基于链表的链式访问结构的区别,重点介绍了如何在保证升序的前提下,使用Collections.binarySearch方法进行高效二分查找。文章深入分析了不同类型的List实现对查找性能的影响。
摘要由CSDN通过智能技术生成

在Java集合里,大致分为以数组为基础的随机访问数据结构和以链表为基础的链式访问(不随机)数据结构。

例如,使用java.util.Collections#binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T)进行二分查找时(前提是保证升序,否则使用带有比较器的二分查找方法)是不是RandomAccess的List就有了实现区别。如果不了解二分查找请看这里。这里以集合元素可比较(实现java.lang.Comparable接口)为例,带有比较器的查找方法大体一致,查找方法为java.util.Collections#binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>)。

看源码所知,查找之前先判断List是否可以RandomAccess(或者判断集合大小,不足5000时也走随机访问),如图:

1、如果是java.util.ArrayList或者java.util.Arrays.ArrayList等实现RandomAccess的List,那么就进行数组访问方式的二分查找

2、如果是java.util.LinkedList等通过链表访问的List,就进行java.util.ListIterator双向迭代器访问,

其中get方法为双向游标获取元素

3、另外,在java.util.Collections集合工具类中有很多静态方法和静态内部类,包含

java.util.Collections.CheckedList未实现RandomAccess随机访问;

java.util.Collections.CopiesList实现RandomAccess随机访问;

java.util.Collections.EmptyList实现RandomAccess随机访问;

java.util.Collections.SingletonList实现RandomAccess随机访问;

java.util.Collections.SynchronizedList未实现RandomAccess随机访问;

java.util.Collections.SynchronizedRandomAccessList实现RandomAccess随机访问;

java.util.Collections.UnmodifiableList未实现RandomAccess随机访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值