Java集合类:"随机访问" 的RandomAccess接口

引出RandomAccess接口

如果我们用Java做开发的话,最常用的容器之一就是List集合了,而List集合中用的较多的就是ArrayList 和 LinkedList 两个类,这两者也常被用来做比较。因为最近在学习Java的集合类源码,对于这两个类自然是不能放过,于是乎,翻看他们的源码,我发现,ArrayList实现了一个叫做 RandomAccess 的接口,而 LinkedList 是没有的,

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

打开源码后,发现接口里面什么也没有,这是个空的接口,并且是1.4才引入的

 * @since 1.4
 */
public interface RandomAccess {
}

那么这个接口是做什么的?

标志接口

通过官网的API,我才知道,原来这是一个标志接口,下面引入一段官网的原文:

public interface RandomAccess

Marker interface used by List implementations to indicate that they support fast (generally constant time) random access.

这段话大概的意思就是说 RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持快速随机访问的。也就是说,实现了这个接口的集合是支持 快速随机访问 策略的。

同时,官网还特意说明了,如果是实现了这个接口的 List,那么使用for循环的方式获取数据会优于用迭代器获取数据。

As a rule of thumb, aList implementation should implement this interface if, for typical instances of the class, this loop:

? for (int i=0, n=list.size(); i < n; i++)

list.get(i);

? for (Iterator i=list.iterator(); i.hasNext(); )

i.next();

下面做个测试吧,以ArrayList 为例。

Demo测试

分别创建两个方法,一个用for循环 get() 数据的方式遍历集合,另一个是用迭代器,分别返回所用的时间:

public static long arrayFor() {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 1; i <= 100000; i++) {
        list.add(i);
    }
    //开始时间
    long startTime = System.currentTimeMillis();

    for (int j = 0; j < list.size(); j++) {
        Object num = list.get(j);
    }

    //结束时间
    long endTime = System.currentTimeMillis();

    //返回所用时间
    return endTime-startTime;
}

public static long arrayIterator() {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 1; i <= 100000; i++) {
        list.add(i);
    }
    long startTime = System.currentTimeMillis();

    Iterator iterator = list.iterator();
    while (iterator.hasNext()){
        Object next = iterator.next();
    }

    long endTime = System.currentTimeMillis();

    return endTime-startTime;
}

接着,在mian方法中测试:

public static void main(String[] args) {
    long time1 = arrayFor();
    long time2 = arrayIterator();

    System.out.println("ArrayList for循环所用时间=="+time1);
    System.out.println("ArrayList 迭代器所用时间=="+time2);
}

运行程序,输出结果

ArrayList for循环所用时间==2
ArrayList 迭代器所用时间==3

可以看出,for循环遍历元素时间上是少于迭代器的,证明RandomAccess 接口确实是有这个效果。

当然,现在的语言和机器性能这么高,两种方式遍历数据的性能差距几乎可以忽略不计,尤其是数据量不大的情况下。所以,我觉得,日常使用中没必要过分追求哪种方式好,按照自己的习惯来就行。

原文地址:https://www.cnblogs.com/yeya/p/9950723.html

时间: 2024-08-01 12:10:23

Java集合类:"随机访问" 的RandomAccess接口的相关文章

Java集合类里面最基本的接口

Collection:代表一组对象,每一个对象都是它的子元素. Set:不包含重复元素的Collection. List:有顺序的Collection,并且可以包含重复元素. Map:可以把键(key)映射到值(value)的对象,键不能重复. 原文地址:https://www.cnblogs.com/Yanss/p/11718172.html

RandomAccess接口

在继续讲解ArrayList源码之前,我们先看一些其他的类和接口. RandomAccess是一个接口,位于java.util包中. 这个接口的作用注释写的很清楚了: /** * Marker interface used by <tt>List</tt> implementations to indicate that * they support fast (generally constant time) random access. The primary * purpos

java 集合类基础问题汇总

 1.Java集合类框架的基本接口有哪些? 参考答案 集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有些不允许.Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类.Java集合类里面最基本的接口有:Collection:代表一组对象,每一个对象都是它的子元素.Set:不包含重复元素的Collection.List:有顺序的collection,并且可以包含重复元素.Map:可以把键(key)

深入解析 Java集合类ArrayList与Vector的区别

集合类分为两个分支,Collection与Map,其中Collection接口继承了Iterator接口,继承Iterator接口的类可以使用迭代器遍历元素(即Collection接口的类都可以使用),今天我们从相同点.不同点.以及JDK源码等各个方面来深入解析下,底层使用数组实现的两个集合类:ArrayList与Vector的区别与联系 区别与联系: 1.ArrayList出现于jdk1.2,vector出现于1.0.两者底层的数据存储都使用的Object数组实现,因为是数组实现,所以具有查找

Java集合类--温习笔记

最近去面试,发现自己好多基础知识都一知半解,明明自己脑子里明白,明白这个知识点的原理,但就是说不出来,也不知道是自己表达能力的问题,还是其实自己对这些知识并没有掌握,趁每天空闲时间,好好再补下基础(闹心,话说有些知识刚学的时候不理解,但是能行记住,用过后理解了,反而记不住了).(都是看的网上资料,写的乱,仅作为个人笔记使用) Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类.Java集合类里面最基本的接口有:1.Collection:代表一组对象,每一个对象都是它的子元素.2.

Java API —— IO流(数据操作流 &amp; 内存操作流 &amp; 打印流 &amp; 标准输入输出流 &amp; 随机访问流 &amp; 合并流 &amp; 序列化流 &amp; Properties &amp; NIO)

1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出流写入稍后由数据输入流读取的数据. · DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入. package datastreamdemos; import java.io.*; /** * Created b

Java基础知识强化之IO流笔记63:随机访问流RandomAccessFile

1. 随机访问流RandomAccessFile RandomAccessFile类不属于流,是Object类的子类.但它融合了InputStream和OutputStream的功能.支持对随机访问文件的读取和写入. RandomAccessFile的构造方法: 构造方法摘要 RandomAccessFile(File file, String mode)           创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定. RandomAccessFile(St

Java知多少(111)几个重要的java数据库访问类和接口

修改数据表记录也有3种方案. 一.使用Statement对象 实现修改数据表记录的SQL语句的语法是:    update表名 set 字段名1 = 字段值1,字段名2 = 字段值2,……where特定条件例如: update ksInfo set 姓名 = ‘张小卫’where 姓名 = ‘张大卫’ 先创建一个SQL语句,然砶调用Statement对象的executeUpdate()方法.例如, 1 sql = “update ksInfo set 姓名 = ‘”+txtName.getTex

java 21 - 12 随机访问流(不属于IO流)

随机访问流: RandomAccessFile类不属于流,是Object类的子类. 但它融合了InputStream和OutputStream的功能. 支持对文件的随机访问读取和写入. public RandomAccessFile(String name,String mode):第一个参数是文件路径,第二个参数是操作文件的模 mode:参数指定用以打开文件的访问模式.允许的值及其含意为: 值 含意 "r" 以只读方式打开.调用结果对象的任何 write 方法都将导致抛出 IOExc