重要接口—RandomAccess接口

原文作者:志波同学

原文地址:Java编程:RandomAccess接口

目录

一、随机访问和串行访问

二、快速随机访问


RandomAccess 是一个标记接口,标识实现该接口的类支持快速随机访问。

一、随机访问和串行访问

举个例子:在 Java 中,有 ArrayList 和 LinkedList 两种数据类型。

  • ArrayList 是基于数组实现的,可以通过数组下表灵活的访问列表中的任意元素。像 ArrayList 这种设计,我们就称之为随机访问
  • LinkedList 是基于 next 引用实现的,只能通过串行的方式,从头到尾逐个查找目标元素。像 LinkedList 这种设计,我们称之为串行访问

二、快速随机访问

根据 RandomAccess 的注释理解,如果“代码一”的执行速度比“代码二”快,则应该实现 RandomAccess 接口。换句话说,如果集合类(List)实现了 RandomAccess 接口,则采用“代码一”的方式能够获得更高的执行效率。这也是为什么阿里巴巴的代码规约中推荐使用“代码一”的方式进行集合遍历。

代码一:
for (int i=0, n=list.size(); i < n; i++)
    list.get(i);
    	
代码二:
for (Iterator i=list.iterator(); i.hasNext(); )
    i.next();

通过查看源代码,我们会发现 ArrayList 实现了 RandomAccess 接口,LinkedList 则没有实现,具体原因我们可以分析一个两个类的 get 方法,在这里我们不进行具体分析,大家自己看源码哈。


package java.util;

/**
 *1. 被 List 实现类使用的标记接口,标识该类支持快速随机访问(通常是常量访问时间)。该接口的主要目的是在进行随机或者串行访问 list 时,允许算法修改他们的行为来获得更好的性能。
 *
 * 2. 将随机访问 lists(如 ArrayList)的最好算法应用于顺序访问 lists(如 LinkedList)时,可能会产生二次行为(我的理解:这里的二次行为指的是通过遍历 LinkedList ,找到目标对象,
*这比通过 ArrayList 银锁直接获取目标对象,多了一个遍历行为,这个遍历行为就是二次行为)。如果将随机访问算法应用于串行访问 list 时,将会产生较差的性能。鼓励通用列表算法在应用之前,
*先检查 List 是否实现了 RandomAccess 接口,如果实现该接口,则采用快速随机访问法进行遍历,否则使用迭代器的方式进行访问。

 * 3. 人们认识到随访访问和串行访问的区别通过是模糊的。例如,如果 List 变得很大,则提供渐近线性的访问时间,然而在实践中基本上是常量访问时间,像这样的 List 应该实现RandomAccess 接口。根据经验,如果“算法一”的访问速度比“算法二”快,则 List 应该实现RandomAccess 接口。
 * algorithm1:
 * <pre>
 *     for (int i=0, n=list.size(); i &lt; n; i++)
 *         list.get(i);
 * </pre>
 * runs faster than this loop:
 * algorithm2:
 * <pre>
 *     for (Iterator i=list.iterator(); i.hasNext(); )
 *         i.next();
 * </pre>
 * <p>This interface is a member of the
 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
 * Java Collections Framework</a>.
 *
 * @since 1.4
 */
public interface RandomAccess {
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值