ArrayList.ListIterator(int index)vs ArrayList.get(int index)

时间:2010-12-08 13:23:04

标签: java arraylist

我想知道使用ArrayList.ListIterator(int index - 1)时的性能影响,然后it.next()与使用ArrayList.get(int index)形成对比吗?

3 个答案:

答案 0 :(得分:4)

为什么要看实现......

1:List.listIterator(int)

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();
    }
}

2:List.get(int)

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方法从请求数组中获取请求的对象。