借用jdk1.8中的源码:
public interface RandomAccess {
}
就是一个空接口,只是起标记作用,标记的随机访问任意下标元素都比较快的类,上面的解释例子说的是:
如果一个类实现了这接口,表明有一下的特征,
for (int i=0, n=list.size(); i < n; i++)
list.get(i);
运行的快点比下面的循环:
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
正巧的是我们常用的ArrayList就是实现了这个接口.
下面我们写代码进行测试:
public class RandomAccessDemo {
public static void test(List list) {
long startTime;
long endTime;
//遍历前先判读是否实现了RandomAccess接口
if (list instanceof RandomAccess) {
System.out.println(list.getClass() + "实现了RandomAccess接口");
} else {
System.out.println(list.getClass() + "未实现RandomAccess接口");
}
System.out.println("1.以实现RandomAccess接口方式访问");
startTime = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
}
endTime = System.currentTimeMillis();
System.out.println("耗时:" + (endTime - startTime));
System.out.println("2.以未实现RandomAccess接口方式访问");
startTime = System.currentTimeMillis();
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
Object o = iter.next();
}
endTime = System.currentTimeMillis();
System.out.println("耗时:" + (endTime - startTime));
System.out.println("3.for循环的方式进行遍历");
startTime = System.currentTimeMillis();
for (Object o : list) {
Object o2=0;
}
endTime = System.currentTimeMillis();
System.out.println("耗时:" + (endTime - startTime));
}
/**
* ArrayList 实现了RandomAccess接口,而LinkedList没有实现
*/
public static void main(String[] args) {
List arraylist = new ArrayList();
// 添加1000个元素
for (int i = 0; i < 100000; i++) {
arraylist.add("aaa");
}
List linkList = new LinkedList();
// 添加1000个元素
for (int i = 0; i < 100000; i++) {
linkList.add("aaa");
}
//test(arraylist);// 7 6 5
test(linkList); // 4156 4 7
}
}
可以明显的看到LinkedList的使用,使用
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
}
这种遍历方式,性能特别差,因为LinkedList使用的是链表的方式.在内存中的分布不一定是连续的,,而ArrayList使用的是连续的数组进行创建的,内存中是连续的,造成的性能的差异.其实我们一般用for循环就好了,性能差不多的.哈哈,偷懒的方式.
就说道这里了.