从列表Java ArrayList vs LinkedList中删除每个第n个元素

时间:2018-04-22 18:53:31

标签: java performance arraylist data-structures linked-list

所以我想测试ArrayList和LinkedList remove()方法的时间只是为了好玩。

我在下面写了代码来做 - 一切都是不言自明的:deleteEachNth贯穿我的列表并删除它看到的每个第n个元素。

我期待看到LinkedList获得巨大的优势,因为它的删除时间是恒定时间操作,但我的代码会产生相反的结果:对于10000个元素,ArrayList的速度是其两倍。

当然,我认为我写错了,或许使用了get(),这会使LinkedList减慢到某个地方,但事实并非如此。

这里有什么问题?

编辑:用System.currentTimeInMillis()替换System.nanoTime()时,LinkedList对我的代码仍然表现更差。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.IntStream;

public class Test{
    List<String> myList;
    Test(List<String> someList){
        myList = someList;
    }
    void eliminateEachNth(int n){
        for (int i = 1; i < myList.size(); i++) {
            if(i%(n-1)==0){
                myList.remove(i);
            }
        }
    }
    public static void main(String[] args){
        List<String> someList = new ArrayList<>();
        IntStream.range(1, 10000).forEach(i->someList.add(Integer.toString(i)));
        Test testArray = new Test(someList);
        long cur = System.currentTimeMillis();
        testArray.eliminateEachNth(3);
        System.out.println("array list took " + (System.currentTimeMillis() - cur) + "millis");
        System.out.println(someList);
        List<String> anotherList = new LinkedList<>();
        IntStream.range(1, 10000).forEach(i->anotherList.add(Integer.toString(i)));
        Test testLinked = new Test(anotherList);
        cur = System.currentTimeMillis();
        testLinked.eliminateEachNth(3);
        System.out.println("linked list took " + (System.currentTimeMillis() - cur) + "millis");
        System.out.println(anotherList);

    }
}

0 个答案:

没有答案