博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于接口 RandomAccess
阅读量:6940 次
发布时间:2019-06-27

本文共 3920 字,大约阅读时间需要 13 分钟。

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

public static 
void fill(List
list, T obj) { int size = list.size(); if (size < FILL_THRESHOLD || list instanceof RandomAccess) { // 这一行 for (int i=0; i
itr = list.listIterator(); for (int i=0; i
 

上面代码中标识的一行, 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
* @version 创建时间:2017年6月18日 下午6:01:14
*/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时间

 

 

 

以上。

 

转载地址:http://mpsnl.baihongyu.com/

你可能感兴趣的文章
node.js简介
查看>>
iOS 网络与多线程--7.Performselector消息处理方法
查看>>
js 大图轮播
查看>>
对shell脚本进行加密
查看>>
CSS3实现3D动画
查看>>
(五) solr 索引数据导入:csv格式
查看>>
C#-判断Shift,Alt,Ctrl是否被按下,确定所按下的组合键
查看>>
[POJ268] Prime Distance(素数筛)
查看>>
phpexcel使用
查看>>
NOIP2016 D2T3 愤怒的小鸟
查看>>
[转]数据结构:图的存储结构之邻接表
查看>>
【Android开源库】美团等APP城市选择
查看>>
Python_基础_(正表达式)
查看>>
python基础2(数据类型、数据运算、for循环、while循环、列表)
查看>>
ORA-00020: maximum number of processes (xxxx) exceeded 报错解决方法
查看>>
食疗调养的歌诀
查看>>
mysqli_connect和mysql_connect的区别
查看>>
sqlserver 行转列、字符串行转列、自动生产行转列脚本
查看>>
实现类似mysql group_concat的功能
查看>>
仿微信表情输入
查看>>