1:还是先上一个类的继承关系比较图吧!

2:看一下 RandomAccess.java 的源码,空空如也,什么都没有,那她有什么用处呢?

/**
* Marker interface used by <tt>List</tt> implementations to indicate that
* they support fast (generally constant time) random access. The primary
* purpose of this interface is to allow generic algorithms to alter their
* behavior to provide good performance when applied to either random or
* sequential access lists.
*
* <p>The best algorithms for manipulating random access lists (such as
* <tt>ArrayList</tt>) can produce quadratic behavior when applied to
* sequential access lists (such as <tt>LinkedList</tt>). Generic list
* algorithms are encouraged to check whether the given list is an
* <tt>instanceof</tt> this interface before applying an algorithm that would
* provide poor performance if it were applied to a sequential access list,
* and to alter their behavior if necessary to guarantee acceptable
* performance.
*
* <p>It is recognized that the distinction between random and sequential
* access is often fuzzy. For example, some <tt>List</tt> implementations
* provide asymptotically linear access times if they get huge, but constant
* access times in practice. Such a <tt>List</tt> implementation
* should generally implement this interface. As a rule of thumb, a
* <tt>List</tt> implementation should implement this interface if,
* for typical instances of the class, this loop:
* <pre>
* for (int i=0, n=list.size(); i &lt; n; i++)
* list.get(i);
* </pre>
* runs faster than this loop:
* <pre>
* for (Iterator i=list.iterator(); i.hasNext(); )
* i.next();
* </pre>
*
* <p>This interface is a member of the
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
* Java Collections Framework</a>.
*
* @since 1.4
*/
public interface RandomAccess {
}

有点磕磕巴巴,阅读了源码中的注释,大概讲解了一下 RandomAccess.java 接口的作用,它是一个标记接口,表示实现它的类支持快速随机访问,通过上图的对比我们看到实现List接口的类,有些是支持快速随机访问的,有些不支持,怎么标记哪?就是用 RandomAccess.java 接口来标记,这样有什么好处呢?可以在通用的实现List集合遍历的时候算法中,针对实现 RandomAccess.java 接口的集合,可以有选择性的使用性能更好的遍历方式,我也实验了一把,继续往下看吧!

3:简单的集合遍历性能对比小栗子,代码比较简单,可以调整参数自行玩一玩

/**
* @description:测试循环方式的性能
* @author:godtrue
* @create:2018-09-11
*/
public class TestTraverse {
/**
* 开始循环的基值
*/
private static final int START_LOOP = 1; /**
* 结束循环的基值
* 我的机器 1亿 次就卡死了,我就实验下 1千万 次吧!
*/
private static final int END_LOOP = 10000000; /**
*
*@description: 测试入口,主方法
*@param args
*@return: void
*@author: godtrue
*@createTime: 2018-09-11
*@version: v1.0
*/
public static void main(String[] args) {
/**
* 注意:
* 1:测试时,一个个来跑,避免相互影响
* 2:可以逐渐,将 TestTraverse.END_LOOP 调高,用于观察不同量级的循环的运行结果
*/
traverse(genArrayList());
//traverse(genLinkedList());
} /**
*
*@description: 遍历 list 集合,这里能体现到 RandomAccess 接口的作用,可以选择不同的遍历集合的方式
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-11
*@version: v1.0
*/
private static void traverse(List list){
if(list instanceof RandomAccess){
traverseByLoop(list);
}else {
traverseByIterator(list);
}
} /**
*
*@description: 循环遍历 list 集合
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-11
*@version: v1.0
*/
private static void traverseByLoop(List list){
long startTime = System.currentTimeMillis();
for(int i=0,sum=list.size();i<sum;i++){
list.get(i);
}
System.out.println("exe traverseByLoop cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 迭代遍历 list 集合
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-11
*@version: v1.0
*/
private static void traverseByIterator(List list){
long startTime = System.currentTimeMillis();
for (Iterator i=list.iterator(); i.hasNext(); ){
i.next();
}
System.out.println("exe traverseByIterator cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 生成 ArrayList 数据信息
*@param
*@return: java.util.List<java.lang.String>
*@author: godtrue
*@createTime: 2018-09-11
*@version: v1.0
*/
private static List<String> genArrayList(){
long startTime = System.currentTimeMillis();
List<String> list = new ArrayList<String>();
for(int i=TestTraverse.START_LOOP;i<TestTraverse.END_LOOP;i++){
list.add(String.valueOf(i));
}
System.out.println("exe genArrayList cost time : "+(System.currentTimeMillis()-startTime));
return list;
} /**
*
*@description: 生成 LinkedList 数据信息
*@param
*@return: java.util.List<java.lang.String>
*@author: godtrue
*@createTime: 2018-09-11
*@version: v1.0
*/
private static List<String> genLinkedList(){
long startTime = System.currentTimeMillis();
List<String> list = new LinkedList<String>();
for(int i=TestTraverse.START_LOOP;i<TestTraverse.END_LOOP;i++){
list.add(String.valueOf(i));
}
System.out.println("exe genLinkedList cost time : "+(System.currentTimeMillis()-startTime));
return list;
}
}

4:下面是实验环境的信息和结果

4-1)实验的硬件信息

4-2)运行时的性能指标参数

4-3)迭代遍历的运行情况

4-4)随机遍历的运行情况,对比一下,可以看出性能相差的还是蛮多的

分析轮子(七)- RandomAccess.java的更多相关文章

  1. 分析轮子(五)- Vector.java

    注:玩的是JDK1.7版本 一: 先上类图,从类图上看和 ArrayList.java 非常相像,可查看 分析轮子(一)-ArrayList.java 二:然后看源码,发现和 ArrayList.ja ...

  2. 分析轮子(四)- 我也玩一把 Serializable.java

    前言:在写 分析轮子(一)-ArrayList.java 的时候曾经下过一个结论 “实现Serializable接口,表示ArrayList是可序列化的”,这个结论是以往学习的经验所得,并且平时在编程 ...

  3. 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)

    前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...

  4. JVM 内部原理(七)— Java 字节码基础之二

    JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  5. 20165203《Java程序设计》第七周Java学习总结

    20165203<Java程序设计>第七周Java学习总结 教材学习内容总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称MySQL,是世 ...

  6. LINUX内核分析第七周学习总结:可执行程序的装载

    LINUX内核分析第七周学习总结:可执行程序的装载 韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  7. 聊聊并发(七)——Java中的阻塞队列

    3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...

  8. Linux内核分析(七)----并发与竞态

    原文:Linux内核分析(七)----并发与竞态 Linux内核分析(七) 这两天家里的事好多,我们今天继续接着上一次的内容学习,上次我们完善了字符设备控制方法,并深入分析了系统调用的实质,今天我们主 ...

  9. Linux内核分析 第七周 可执行程序的装载

    张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第七 ...

随机推荐

  1. 006.Ceph对象存储基础使用

    一 Ceph文件系统 1.1 概述 Ceph 对象网关是一个构建在 librados 之上的对象存储接口,它为应用程序访问Ceph 存储集群提供了一个 RESTful 风格的网关 . Ceph 对象存 ...

  2. pyspider 启动错误遇到的一些坑

    https://blog.csdn.net/SiHann/article/details/88239892 突然接到一个项目是关于pyspider,遇到了一些小坑,百度一下发现并没有很好的解决所以研究 ...

  3. 潭州课堂25班:Ph201805201 django框架 第三课 模板路径,变量,过滤器,静态文件的引用 (课堂笔记)

    第二种方法 首先   'APP_DIRS': True, 将 app 的名字在 INSTALLED_APPS 进行注册 模板变量 传的各种数据类型,和取值 过渡器: 静态文件: 在项目文件目录 中创建 ...

  4. STM32点亮闪烁LED灯

    详解请看其他博客: http://www.cnblogs.com/whik/p/6672730.html http://www.51hei.com/bbs/dpj-38605-1.html /*本程序 ...

  5. 浅谈KMP“串”的模式匹配问题

    感悟:预处理next[ ]数组求解B串的"自我匹配过程",思路与KMP类似,目标得到最大相同的前缀.后缀. ([1->k]==[i-k+1,i]),可以根据由前往后,利用前面 ...

  6. BZOJ4910 : [Sdoi2017] 苹果树

    问题等价于树形依赖背包,允许一条链每个点各免费一次. 设$f[i][j]$表示按DFS序考虑到$i$,体积为$j$的最大收益. 先放入不能免费的物品,等遍历完儿子后再放入必选的物品,那么$i$到根路径 ...

  7. tableviewcell选中不变色。

    tableview 选中一行后,不显示选中颜色 添加这样一句话就好 cell.selectionStyle = UITableViewCellSelectionStyleNone; 一定不要table ...

  8. Egret 按钮点击缩放效果

    非代码设计,exml直接操作 设计模式下选中对象,之后[源码],会直接定位到该对象在exml源码中的位置 width.down = "100%" 表示当按钮按下的时候宽度为 100 ...

  9. 【LCA】求和VII @北京OI2018

    目录 求和VII PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE 求和VII PROBLEM 时间限制: 2 Sec 内存限制: 256 MB 题目描述 m ...

  10. H3C505

    H3C505 1.立方体案例 2.3D变换 1)景深透视 prospective:xx px; 设置观察元素的距离,数值小时,在元素内进行观察 prospective-origin: xpx,xpx ...