标记接口
在学习RandomAccess接口之前我们先学习一下标记接口,简单的说标记接口就是没有任何属性和方法的接口,只是用来标识实现该接口的类具有某种特定的功能。
jdk中常见的标记接口有Cloneable接口、Serializable接口和本文要学习的RandomAccess接口,接口定义分别如下。
Cloneable接口:
package java.lang;
/**
* @author unascribed
* @see java.lang.CloneNotSupportedException
* @see java.lang.Object#clone()
* @since JDK1.0
*/
public interface Cloneable {
}
Serializable接口:
package java.io;
/**
* @author unascribed
* @see java.io.ObjectOutputStream
* @see java.io.ObjectInputStream
* @see java.io.ObjectOutput
* @see java.io.ObjectInput
* @see java.io.Externalizable
* @since JDK1.1
*/
public interface Serializable {
}
RandomAccess接口:
package java.util;
/**
* @since 1.4
*/
public interface RandomAccess {
}
可见这三个接口都没有定义方法和属性,Cloneable接口和Serializable接口表示的含义会有专门的文章来介绍,本文只介绍RandomAccess接口。
RandomAccess接口的官方解释
jdk文档对RandomAccess接口的描述可以归纳为两点:
1.实现RandomAccess接口的列表类支持快速随机访问(即可以通过下标对List进行存取操作)
2.实现RandomAccess接口的列表实例化对象list此循环
for (int i=0, n=list.size(); i < n; i++)
list.get(i);
比
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
运行速度要快
RandomAccess接口如何使用
jdk中java.util.Collections类中多处使用RandomAccess,例如Collections类的fill()方法:
public 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);
}
}
}
在遍历列表进行赋值之前会对该列表做一次校验,如果该列表实现了RandomAccess接口就使用索引对列表中指定位置的元素进行赋值,否则使用迭代器next()方法对该元素赋值。
在开发的过程中可以参考这种方式实现。
网友评论