今天看到java.util.Collections这个工具类中的

 public static <T> void fill(List<? super T> list, T obj) {
int size = list.size();
if (size < FILL_THRESHOLD || list instanceof RandomAccess) { // 这一行
for (int i=0; i<size; i++)
list.set(i, obj);
} else {
ListIterator<? super T> itr = list.listIterator();
for (int i=0; i<size; i++) {
itr.next();
itr.set(obj);
}
}
}


上面代码中标识的一行, FILL_THRESHOLD 是25,就是说,如果要填充的目标List范围不是很大,那么就直接用上面的方式效率比较高,同时注意到   list instanceof RamdomAccess 这个代码,顺便翻到里面去瞅了一眼,RamdomAccess 接口是一个空接口,空接口的作用一般起到一个标识作用,比如:Serializable 接口。

RaomdomAccess接口里面的文档说明大致意思:给可以提供随机访问的List实现去标识一下,这样使用这个List的程序在遍历这种类型的List的时候可以有更高效率。仅此而已。

所以,我们在遍历List之前,可以用  if( list instanceof RamdomAccess ) 来标识一下,选择用哪种遍历方式。

测试代码:

package com.zslin.list.demo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.RandomAccess; //JDK中说的很清楚,在对List特别是Huge size的List的遍历算法中,
// 要尽量来判断是属于RandomAccess(如ArrayList)还是Sequence List (如LinkedList),
// 因为适合RandomAccess List的遍历算法,用在Sequence List上就差别很大,常用的作法就是:
// 要作一个判断:
// if (list instance of RandomAccess) {
// for(int m = 0; m < list.size(); m++){}
// }else{
// Iterator iter = list.iterator();
// while(iter.hasNext()){}
// } /**
*
* @author WQ<br>
* @version 创建时间:2017年6月18日 下午6:01:14<br>
*/
public class TestRandomAccess {
// 初始化列表 public static void initList(List list, int n) {
for (int i = 0; i < n; i++) {
list.add(i);
}
} // 使用循环进行对列表的迭代 public static void traverseWithLoop(List list) {
long starttime = 0;
long endtime = 0;
starttime = System.currentTimeMillis();
for (int count = 0; count <= 1000; count++) {
for (int i = 0; i < list.size(); i++) {
list.get(i);
}
}
endtime = System.currentTimeMillis();
System.out.println("使用loop迭代一共花了" + (endtime - starttime) + "ms时间"); } // 使用迭代器对列表进行迭代 public static void traverseWithIterator(List list) {
long starttime = 0;
long endtime = 0;
starttime = System.currentTimeMillis();
for (int count = 0; count <= 1000; count++) {
for (Iterator itr = list.iterator(); itr.hasNext();) {
itr.next();
}
}
endtime = System.currentTimeMillis();
System.out.println("使用Iterator迭代一共花了" + (endtime - starttime) + "ms时间");
} public static void traverse(List list) { long starttime = 0;
long endtime = 0;
if (list instanceof RandomAccess) {
System.out.println("该list实现了RandomAccess接口");
starttime = System.currentTimeMillis();
for (int count = 0; count <= 1000; count++) {
for (int i = 0; i < list.size(); i++) {
list.get(i);
}
}
endtime = System.currentTimeMillis();
System.out.println("迭代一共花了" + (endtime - starttime) + "ms时间");
} else {
System.out.println("该list未实现RandomAccess接口");
starttime = System.currentTimeMillis();
for (int count = 0; count <= 1000; count++) {
for (Iterator itr = list.iterator(); itr.hasNext();) {
itr.next();
}
}
endtime = System.currentTimeMillis();
System.out.println("迭代一共花了" + (endtime - starttime) + "ms时间");
}
} public static void main(String[] args) {
ArrayList arraylist = new ArrayList();
LinkedList linkedlist = new LinkedList();
initList(arraylist, 1000);
initList(linkedlist, 1000);
traverse(arraylist);
traverse(linkedlist);
traverseWithIterator(arraylist);
traverseWithLoop(arraylist);
traverseWithIterator(linkedlist);
traverseWithLoop(linkedlist);
}
}

运行结果如下:

该list实现了RandomAccess接口
迭代一共花了9ms时间
该list未实现RandomAccess接口
迭代一共花了10ms时间
使用Iterator迭代一共花了12ms时间
使用loop迭代一共花了7ms时间
使用Iterator迭代一共花了14ms时间
使用loop迭代一共花了396ms时间

以上。

关于接口 RandomAccess的更多相关文章

  1. OpenJDK源码研究笔记(三)-RandomAccess等标记接口的作用

    标识接口是没有任何方法和属性的接口. 它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情. 下面来看一个标记接口RandomAccess. public interface Rando ...

  2. 难倒你了吧!ArrayList 为啥要实现 RandomAccess 接口?

    作者:蔡先森_caiyq https://www.jianshu.com/p/3e2a9e4c9e01 在我们的开发中,List接口是最常见不过,而且我们几乎每天都在用ArrayList或者Linke ...

  3. Java 容器 接口

    Java 中容器框架的内容可以分为三层: 接口(模型), 模板和具体实现. 在开发中使用容器正常的流程是,首先根据需求确定使用何种容器模型,然后选择一个符合性能要求的容器实现类或者自己实现一个容器类. ...

  4. Java容器解析系列(3) List AbstractList ListIterator RandomAccess fail-fast机制 详解

    做为数据结构学习的常规,肯定是先学习线性表,也就是Java中的List,开始 Java中List相关的类关系图如下: 此篇作为对Java中相关类的开篇.从上图中可以看出,List和AbstractLi ...

  5. ArrayList 浅析示例

    package com.smbea.demo; import java.util.ArrayList; import java.util.Iterator; import java.util.List ...

  6. java2集合框架的一些个人分析和理解

    Java2中的集合框架是广为人知的,本文打算从几个方面来说说自己对这个框架的理解. 下图是java.util.Collection的类图(基本完整,有些接口如集合类均实现的Cloneable.Seri ...

  7. Java 核心技术-集合-集合框架

    说在前面的话: 关于Core Java 集合方面的博文网上已经写烂了,为啥我还要写呢? 答:他们写的都很好,我也学到不少东西,如果把我当做一个系统的话,学习别人.看书.读源码是输入,但是往往形不成一个 ...

  8. Java集合类操作优化总结

    清单 1.集合类之间关系 Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHas ...

  9. Java集合类操作优化经验总结

    本文首先针对 Java 集合接口进行了一些介绍,并对这些接口的实现类进行详细描述,包括 LinkedList.ArrayList.Vector.Stack.Hashtable.HashMap.Weak ...

随机推荐

  1. [BZOJ1031][JSOI2007]字符加密Cipher 解题报告

    Description 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...

  2. bzoj 2142 国家集训队试题 礼物

    问题转化成求C(N,M) mod P p为非素数,那么我们可以将P分解质因数, 也就是 π pi^ci的形式,因为这些pi^ci是互质的,所以我们可以用crt将他们合并 那么问题就转化成了快速求C(N ...

  3. Linux kernel中断子系统之(五):驱动申请中断API【转】

    转自:http://www.wowotech.net/linux_kenrel/request_threaded_irq.html 一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的 ...

  4. Centos安装流量监控工具iftop笔记

    Centos安装流量监控工具iftop笔记 一.概述 iftop可以用来监控网卡的实时流量(可以指定网段).反向解析IP.显示端口信息等,详细的将会在后面的使用参数中说明.官方网站:http://ww ...

  5. 新手学习selenium路线图(老司机亲手绘制)-学前篇【转载】

    前言: 本来这篇是只在微信公众号(yoyoketang)上发布的,最近一搜,发现本很多人copy(copy公众号的,图片是加载不出来的)了,还没注明出处,不想多说什么,博客上也同步更新这篇吧! 最近群 ...

  6. mysql主从怎么样使主为innodb辅为myisam

    MySQL主从复制(linux主+windows从) http://blog.csdn.net/qq_20032995/article/details/54380290 mysql主从怎么样使主为in ...

  7. Bringing up interface eth0: Determining if ip address 10.109.67.81 is already in use for device eth0...

    重启网卡出现提示: Bringing up interface eth0:  Determining if ip address 10.109.67.81 is already in use for ...

  8. yii2框架获取刚插入数据库的id (原创)

    $insert_id = $UserModel->attributes['id'];

  9. AC日记——[JSOI2007]建筑抢修 bzoj 1029

    1029 思路: 贪心,而且,stl水过: 然而神特么输出que.size()就错! 代码: #include <queue> #include <cstdio> #inclu ...

  10. Servlet 调用过程

    上图的大概意思: 前台输入访问路径后,浏览器会去访问本地的host文件查询有木有与之匹配域名的IP地址,若无则在访问DNS服务器查询与之匹配的IP地址.解析IP后则开始发起HTTP请求,根据请求中的基 ...