您的位置:首页 > 编程语言 > Java开发

java集合类之随机访问和顺序访问

2017-10-09 10:56 543 查看

概述

java集合类中元素的访问分为随机访问和顺序访问。随机访问一般是通过index下标访问,行为类似数组的访问。而顺序访问类似于链表的访问,通常为迭代器遍历。

以List接口及其实例为例。ArrayList是典型的随机访问型,而LinkedList则是顺序访问型。List接口既定义了下标访问方法又定义了迭代器方法。所以其实例既可使用下标随机访问也可以使用迭代器进行遍历。但这两种方式的性能差异很明显。

RandomAccess接口

JDK中的RandomAccess接口是一个标记接口,它并未定义方法。其目的是用于指示实现类具有随机访问特性,在遍历时使用下标访问较迭代器更快。如果:

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


的运行比

for(Interator i = list.iterator();i.hasNext();)
i.next();


快,则应实现RandomAccess接口。

ArrayList和LinkedList随机访问的区别

ArrayList是数组结构,随机访问具有常量时间。

LinkedList是链表结构,随机访问分为两步:

- 首先根据index查找Node,通常是一个for循环查找index对应的Node

- 然后返回Node中存储的元素

ArrayList的下标遍历性能远高于LinkedList的下标遍历。

测试示例

public class AccessModel {
private long start;
private long stop;

public AccessModel() {

}

private void prepare(List<Integer> list, int cnt) {
for (int i = 0; i < cnt; i++) {
list.add(i);
}
}

public void doTest() {
ArrayList<Integer> array = new ArrayList<>();
LinkedList<Integer> link = new LinkedList<>();

prepare(array, 10000);
prepare(link, 10000);

randomAccess(array);
randomAccess(link);

sequentialAccess(array);
sequentialAccess(link);
}

private void randomAccess(List<Integer> l) {
start = System.currentTimeMillis();
for (int count = 0; count <= 1000; count++) {
for (int i = 0; i < l.size(); i++) {
l.get(i);
}
}
stop = System.currentTimeMillis();
System.out.println("random access used:" + (stop - start) + "ms.");
}

private void sequentialAccess(List<Integer> l) {
start = System.currentTimeMillis();
for (int count = 0; count <= 1000; count++) {
for (Iterator<Integer> it = l.iterator(); it.hasNext();) {
it.next();
}
}
stop = System.currentTimeMillis();
System.out.println("sequential access used:" + (stop - start) + "ms.");
}
}


prepare 10000次的结果如下:

random access used:8ms.

random access used:40057ms.

sequential access used:14ms.

sequential access used:49ms.

prepare 1000次的结果如下:

random access used:8ms.

random access used:340ms.

sequential access used:10ms.

sequential access used:11ms.

随机访问的性能都是高于顺序访问。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java linkedlist arraylist