首页 / MAC / 关于接口 RandomAccess
关于接口 RandomAccess
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了关于接口 RandomAccess,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4006字,纯文字阅读大概需要6分钟。
内容图文
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
标签:count string print tor 作用 set mil util ram
本文系统来源:http://www.cnblogs.com/mr-wuxiansheng/p/7044899.html
内容总结
以上是互联网集市为您收集整理的关于接口 RandomAccess全部内容,希望文章能够帮你解决关于接口 RandomAccess所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。