本文共 3920 字,大约阅读时间需要 13 分钟。
今天看到java.util.Collections这个工具类中的
public staticvoid 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/