Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JAVA之Collection(一):关于RandomAccess的讨论

JAVA之Collection(一):关于RandomAccess的讨论

作者头像
Charles-LZ
修改于 2019-04-08 08:23:18
修改于 2019-04-08 08:23:18
7700
举报
文章被收录于专栏:Charles的java专栏Charles的java专栏

在阅读Collectios类源码时,发现一些方法常常出现list instanceof RandomAccess的字样,下面以binarySearch为例:

public static <T>

int binarySearch(List<? extends Comparable<? super T>> list, T key) {

if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)

return Collections.indexedBinarySearch(list, key);

else

return Collections.iteratorBinarySearch(list, key);

}//instanceof用来判断某对象是否为某个类或者接口类型

有了这个限制条件之后返回的方法又有什么区别呢?

下面分别来看indexedBinarySearchiteratorBinarySearch的源码

indexedBinarySearch

private static <T>

int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {

int low = 0;

int high = list.size()-1;

while (low <= high) {

int mid = (low + high) >>> 1;

Comparable<? super T> midVal = list.get(mid);

int cmp = midVal.compareTo(key);

if (cmp < 0)

low = mid + 1;

else if (cmp > 0)

high = mid - 1;

else

return mid; // key found

}

return -(low + 1); // key not found

}

iteratorBinarySearch

private static <T>

int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)

{int low = 0;

int high = list.size()-1;

ListIterator<? extends Comparable<? super T>> i = list.listIterator();

while (low <= high) {

int mid = (low + high) >>> 1;

Comparable<? super T> midVal = get(i, mid);

int cmp = midVal.compareTo(key);

if (cmp < 0)

low = mid + 1;

else if (cmp > 0)

high = mid - 1;

else

return mid; // key found

}

return -(low + 1); // key not found

}

通过查看源代码发现,未实现RandomAccess接口的的List集合一般采用Iterator循环遍历,实现接口的则采用for循环遍历。那么两者性能的区别在哪呢?

下面给出答案:ArrayList用for循环遍历比iterator迭代器遍历快,LinkedList用iterator迭代器遍历比for循环遍历快。

详细编码来自:https://blog.csdn.net/weixin_39148512/article/details/79234817

所以我们在做项目时,应该考虑到List集合的不同子类采用不同的遍历方式,能够提高性能!

然而有人发出疑问了,那怎么判断出接收的List子类是ArrayList还是LinkedList呢?

这时就需要用instanceof来判断List集合子类是否实现RandomAccess接口!

总结:RandomAccess虽然是个空接口,但通过这个接口可以判断时ArrayList还是LinkedList,从而选择更好的循环遍历方法,提高性能。

---------------------

本文改编于:

作者:DriveMan

原文:https://blog.csdn.net/weixin_39148512/article/details/79234817

(仅作为本人学习使用)

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ArrayList 为什么要实现 RandomAccess 接口?
在我们的开发中,List 接口是最常见不过,而且我们几乎每天都在用 ArrayList 或者 LinkedList,但是细心的同学有没有发现,ArrayList 中实现了 RandomAccess 接口,而 LinkedList 却没有实现 RandomAccess 接口,这是为什么呢?
JavaFish
2020/01/14
5110
ArrayList 为什么要实现 RandomAccess 接口?
jdk源码分析之Collections--二分查找优化
我们基本上都使用过结合工具类Collections,其重要功能和作用是对结合类的一些操作,比如,查找集合中指定元素,集合排序以及集合类型排序等等。此篇我们将对Collections源码中的二分查找做详细分析以及提出优化方案。
叔牙
2020/11/19
4230
jdk源码分析之Collections--二分查找优化
(53) 剖析Collections - 算法 / 计算机程序的思维逻辑
之前几节介绍了各种具体容器类和抽象容器类,上节我们提到,Java中有一个类Collections,提供了很多针对容器接口的通用功能,这些功能都是以静态方法的方式提供的。 都有哪些功能呢?大概可以分为两类: 对容器接口对象进行操作 返回一个容器接口对象 对于第一类,操作大概可以分为三组: 查找和替换 排序和调整顺序 添加和修改 对于第二类,大概可以分为两组: 适配器:将其他类型的数据转换为容器接口对象 装饰器:修饰一个给定容器接口对象,增加某种性质 它们都是围绕容器接口对象的,第一类是针对容器接口的通用操作
swiftma
2018/01/31
1.4K0
(53) 剖析Collections - 算法 / 计算机程序的思维逻辑
面经手册 · 第10篇《扫盲java.util.Collections工具包,学习排序、二分、洗牌、旋转算法》
好的算法搭配上合适的数据结构,可以让代码功能大大的提升效率。当然,算法学习不只是刷题,还需要落地与应用,否则到了写代码的时候,还是会for循环+ifelse。
小傅哥
2020/09/16
3980
面经手册 · 第10篇《扫盲java.util.Collections工具包,学习排序、二分、洗牌、旋转算法》
我就是想找个下标,怎么用到二分查找了?
第一:indexOf底层的遍历如果极端情况下,10000用户,恰好当前用户排在第10000个,那效率太低。
疯狂的KK
2020/09/02
3910
Java 常用工具类 Collections 源码分析
张拭心 shixinzhang
2018/01/05
1.4K0
Java 常用工具类 Collections 源码分析
用斗地主的实例学会使用java Collections工具类
最近在学习数据结构和算法的过程中频繁用到了Collections工具类,这是开发中的一把利器,简化了许多涉及集合的编码,该文将通过实例对此工具类进入深入剖析。
智慧zhuhuix
2020/08/14
6951
用斗地主的实例学会使用java Collections工具类
JDK 工具类之 Collections
/* * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.util; import java.io.Serializable; import java.io.ObjectOutputStream; import java.io.I
一个会写诗的程序员
2022/05/13
2850
JDK源码解析之Java.util.Collections
Collecions定义的这些变量叫做优化参数(Tuning Parameter),其作用在于优化类中方法的性能(permformance)。
栗筝i
2022/12/01
2730
List,Set,Map三者的区别
查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。所以,在我看来 RandomAccess 接口不过是一个标识罢了。标识什么? 标识实现这个接口的类具有随机访问功能。
崔笑颜
2020/06/08
1.7K0
ArrayList 与 LinkedList 区别
查看源码可以看到, RandomAccess 接口中什么都没有定义。所以,这就是个标识接口,标识那些实现了这个接口的类,具有随机访问的功能。
happyJared
2019/06/15
8440
Collection子接口之List
查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。所以,在我看来 RandomAccess 接口不过是一个标识罢了。标识什么? 标识实现这个接口的类具有随机访问功能。
黑洞代码
2021/01/20
5980
Collection子接口之List
Collection和Collections
Collection是集合顶级接口。提供了对集合对象的基本操作的接口方法。Collections是一个工具类,包含各种有关集合的静态多态方法,包括排序、搜索以及线程安全等各种操作,服务于Java的Collection框架。
2019/05/07
5020
算法一回首之《括号匹配验证》
完整代码: https://github.com/helloworldtang/spring-boot-cookbook/blob/v1.0.3-19.1.12/learning-demo/src/main/java/com/tangcheng/learning/exam
烟雨平生
2023/03/07
2380
算法一回首之《括号匹配验证》
ArrayList 源码解析
ArrayList是一种变长的集合类,基于定长数组实现。ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个更大的数组。另外,由于 ArrayList 底层基于数组实现,所以其可以保证在O(1)复杂度下完成随机查找操作。其他方面,ArrayList 是非线程安全类,并发环境下,多个线程同时操作 ArrayList,会引发不可预知的错误。
HLee
2021/05/10
6650
ArrayList 源码解析
Java 集合常见知识点&面试题总结(上),2022 最新版!
Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Collection 接口,下面又有三个主要的子接口:List、Set 和 Queue。
Guide哥
2022/11/07
3300
Java 集合常见知识点&面试题总结(上),2022 最新版!
Java实现常用算法
Javacollections已经内置了一些常用算法,此处作为标记,方便温故而知新
用户7886150
2021/04/07
3910
(38) 剖析ArrayList / 计算机程序的思维逻辑
从本节开始,我们探讨Java中的容器类,所谓容器,顾名思义就是容纳其他数据的,计算机课程中有一门课叫数据结构,可以粗略对应于Java中的容器类,我们不会介绍所有数据结构的内容,但会介绍Java中的主要实现,并分析其基本原理和主要实现代码。 前几节在介绍泛型的时候,我们自己实现了一个简单的动态数组容器类DynaArray,本节,我们介绍Java中真正的动态数组容器类ArrayList。 我们先来看它的基本用法。 基本用法 新建ArrayList ArrayList是一个泛型容器,新建ArrayList需要实
swiftma
2018/01/31
9590
JDK1.8源码(五)——java.util.ArrayList 类
  关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的。 1、ArrayList 定义 ArrayList 是一个用
IT可乐
2018/03/30
1.1K0
JDK1.8源码(五)——java.util.ArrayList 类
「Java面试题精华集」1w字的Java集合框架篇(2020最新版)附PDF版 !
一个多月前,我和一些小伙伴决定做一系列的 Java 知识点常见重要问题的小册,方便用来夯实基础!小册的标准就一个,那就是:取精华,取重点。每一本小册,我们都会充分关注我们所总结的知识点是否达到这个标准。
Guide哥
2020/06/28
1.3K0
「Java面试题精华集」1w字的Java集合框架篇(2020最新版)附PDF版 !
相关推荐
ArrayList 为什么要实现 RandomAccess 接口?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档