我想知道使用ArrayList.ListIterator(int index - 1)时的性能影响,然后it.next()与使用ArrayList.get(int index)形成对比吗?
答案 0 :(得分:4)
为什么要看实现......
public ListIterator<E> listIterator(final int index) {
if (index<0 || index>size())
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
与
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
cursor = index;
}
// [...]
和
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
应该很明显,哪一个更快。有关性能影响的详细信息,我将不得不同意迈克的观点。简介它。无论原因是什么,您都希望使用这种独特的访问方法来访问一个项目(?)
答案 1 :(得分:3)
在我的机器上描述它,其中ArrayList为10,000个整数。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
/**
*
* @author Michael Drogalis
*/
public class Launcher {
public static void main(final String[] args) {
List<Integer> sut = new ArrayList<Integer>();
Random generator = new Random();
for (int k = 0; k < 100000; k++) {
sut.add(generator.nextInt(64));
}
testGetMethod(sut, generator);
testIteratorMethod(sut, generator);
}
private static void testGetMethod(List<Integer> aList, Random aGenerator) {
for (int k = 0; k < 100000; k++) {
aList.get(aGenerator.nextInt(1000));
}
}
private static void testIteratorMethod(List<Integer> aList, Random aGenerator) {
for (int k = 0; k < 100000; k++) {
Iterator iterator = aList.listIterator(Math.abs(aGenerator.nextInt(100000) - 1));
iterator.next();
}
}
}
get
方法需要6.47毫秒才能完成10,000次提取。
Iterator样式花了18.7毫秒到完全10,000次提取。
它们相差近3倍。
修改强>
每个方法描述1000次。以下是一些特别有趣的结果:
get
需要2403毫秒。
迭代器需要3,661 ms。
现在是1.5倍。有趣...
合理的结果 - 我的机器。测试需要您自担风险。
答案 2 :(得分:0)
两者都在O(1)中找到结果(iaw - 时间不依赖于列表的大小)。因此,如果您只使用一次,您就不会注意到小型或大型系列的差异。
但是“ListIterator”解决方案会创建额外的对象而浪费内存,因为我们只有get
方法从请求数组中获取请求的对象。