目录

1.什么是RandomAccess

2.RandomAccess具体实现

3.两种遍历方法性能测试


笔者JDK版本:1.8.0_202

1.什么是RandomAccess

RandomAccess和Cloneable、Serializable接口一样,本质上都是一种标志性接口,无具体实现,意在告知JVM此类(在恒定时间内)可支持快速随机访问。源码中一大段话翻译过来讲了这么几件事:

(1)给List使用的标记型接口,目的是使其支持(在恒定时间内)的快速随机访问

(2)推荐在遍历集合的时候检查该List是否实现了RandomAccess接口,以便让不同的集合使用更优的遍历算法(ArrayList用for循环遍历快一些,LinkedList用迭代器遍历快一些)

(3)通常来说,如果一个List用for循环遍历比用迭代器遍历的速度快,那么推荐实现RandomAccess接口

2.RandomAccess具体实现

Java中的Collectons类提供了静态操作集合的方法,一起看下Collectons中对RandomAccess接口的判断:

如果这个集合实现了RandomAccess接口或者集合大小小于二分查找阀值时,按下标二分查找,否则使用迭代器实现二分查找,对应源码中说到的第2点和第3点。

3.两种遍历方法性能测试

DEMO:

private static void computingTime(List list) {long startTime;long endTime;if (list instanceof RandomAccess) {System.out.println(list.getClass() + "实现了RandomAccess接口");} else {System.out.println(list.getClass() + "未实现RandomAccess接口");}startTime = System.currentTimeMillis();for (int i = 0; i < list.size(); i++) {Object o = list.get(i);}endTime = System.currentTimeMillis();System.out.println("采用for循环的方式遍历集合耗时:" + (endTime - startTime) + "ms");startTime = System.currentTimeMillis();for (Iterator iter = list.iterator(); iter.hasNext(); ) {Object o = iter.next();}endTime = System.currentTimeMillis();System.out.println("采用迭代器的方式遍历集合耗时:" + (endTime - startTime) + "ms");
}
public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();int listSize = 100000;for (int i = 0; i < listSize; i++) {arrayList.add(i);}List<Integer> linkedList = new LinkedList<>();for (int i = 0; i < listSize; i++) {linkedList.add(i);}computingTime(arrayList);computingTime(linkedList);
}

测试demo很简单,10W条数据存入ArrayList和LinkedList后,分别用for循环和迭代器来遍历这两个集合记录遍历时间。通过结果可知,ArrayList for循环遍历的时间小于迭代器遍历时间,而LinkedList for循环遍历的时间选超迭代器遍历时间。原因就和这两个集合的底层实现有关了(在接下来的文章内会详谈),ArrayList底层动态扩容数组,查询时间复杂度O(1),所以两种方式遍历区别不大,快速随机访问略胜一筹;而LinkedList底层基于双向循环链表,因为链表的特性,迭代器查找比快速随机访问(时间复杂度O(n))快的多。

Java集合04 - RandomAccess相关推荐

  1. 【重难点】【Java集合 04】ArrayDeque 的使用场景、ArrayBlockingQueue

    [重难点][Java集合 04]ArrayDeque 的使用场景.ArrayBlockingQueue 的源码实现 文章目录 [重难点][Java集合 04]ArrayDeque 的使用场景.Arra ...

  2. Java 集合系列04之 fail-fast总结

    转载自   Java 集合系列04之 fail-fast总结 概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内 ...

  3. Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)

    http://www.cnblogs.com/skywang12345/p/3308762.html 概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterat ...

  4. Java知识点04——集合(Set、List、Queue、Map、Collection和Iterator、Collections工具类)

    Java知识点04--集合(Set.List.Queue.Map.Collection.Iterator.Collections工具类) 一.集合 1.1 集合概述 二.Collection 2.1 ...

  5. Java集合源码分析(二)ArrayList

    ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...

  6. Java 集合系列06: Vector深入解析

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概论 这是接着以前的文章分享的,这里给出以前的文章的连接,供小伙伴们回顾 ...

  7. Java 集合系列(3): fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)...

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayL ...

  8. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

    转载自  Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与 ...

  9. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...

    本文关键词: java集合框架  框架设计理念  容器 继承层级结构 继承图 集合框架中的抽象类  主要的实现类 实现类特性   集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...

最新文章

  1. RDKit:化合物相似性搜索
  2. Android11有哪些vts
  3. 安顺计算机二级考试,安顺市2020年3月计算机二级报名时间|网上报名入口【12月18日9:00开通】...
  4. 实例演示oracle注入获取cmdshell的全过程
  5. go kegg_KEGG分析及可视化
  6. go:linkname
  7. 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
  8. stc89c51单片机音乐盒系统设计_基于单片机的火控系统语音报读设计
  9. 苹果13英寸MacBook Pro有望下月更新 搭载M2芯片
  10. [HDU3507]Print Article
  11. 持续集成(4)工具对比
  12. Win10 Composer下载安装
  13. b 站视频下载神器合集,支持电脑和手机端
  14. 发卡行 收单行 收单
  15. Mortal Kombat Tower(dp)
  16. 【睡觉中的阿狸!真的被萌到啦】
  17. 在Eclipse上搭建Android开发环境
  18. 蛋花花:人工智能写的诗版权到底算谁的
  19. ROWNUM 与 ROW_NUMBER()OVER() 的区别
  20. 论文种类分类Task4

热门文章

  1. Typora的使用【保姆级教学】
  2. 轮播图插件(swiper)
  3. HDU - 1584 蜘蛛牌
  4. Telegram学习解析系列(一):认识一下Telegram的源码
  5. PCBA测试是什么意思
  6. AxMath使用教程+常用符号与公式(持续更新中)
  7. 上网管理系统--帮助企业管理和分析员工上网行为
  8. noip2007守望者的逃离(超级详细,逐步解析)
  9. 银行卡相关功能简要实现
  10. GNU开发工具简介(一)