java ArrayList、LinkedList循环方式(for foreach)性能对比

319 阅读1分钟

ArrayList和LinkList的区别:

ArrayList:ArrayList是采用数组的形式保存对象,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦,查询比较方便。

LinkList:LinkList是将对象放在独立的节点中,每个节点保存下一个节点的索引,也就是数据结构中的链表结构,插入和删除比较方便,但是查找很麻烦,必须从第一个开始遍历。

下面代码分别测试ArrayList、LinkList两种数据结构使用for、foreach遍历时的性能。


public class ForTest {
    static int loopNum = 100000;

    static long timeArrListFor ;
    static long timeArrListForeach ;

    static long timeLinkedListFor ;
    static long timeLinkedListForeach ;
    public static void main(String[] args) {

        arrListTest();

        linkedListTest();

        System.out.println("timeArrListFor:" + timeArrListFor);
        System.out.println("timeArrListForeach:" + timeArrListForeach);

        System.out.println("timeLinkedListFor:" + timeLinkedListFor);
        System.out.println("timeLinkedListForeach:" + timeLinkedListForeach);
    }

    static void arrListTest() {
        ArrayList<Integer> arrList = new ArrayList();
        for (int i = 0; i < loopNum; i++) {
            arrList.add(i);
        }

        long time1 = System.currentTimeMillis();
        for (int i = 0; i < arrList.size(); i++) {
            System.out.println("i:" + arrList.get(i));
        }

        long time2 = System.currentTimeMillis();
        for (Integer i : arrList) {
            System.out.println("i:" + i);
        }
        long time3 = System.currentTimeMillis();

        timeArrListFor = time2 - time1;
        timeArrListForeach = time3 - time2;
    }

    static void linkedListTest() {
        LinkedList<Integer> arrList = new LinkedList();
        for (int i = 0; i < loopNum; i++) {
            arrList.add(i);
        }

        long time4 = System.currentTimeMillis();
        for (int i = 0; i < arrList.size(); i++) {
            System.out.println("i:" + arrList.get(i));
        }

        long time5 = System.currentTimeMillis();
        for (Integer i : arrList) {
            System.out.println("i:" + i);
        }
        long time6 = System.currentTimeMillis();

        timeLinkedListFor  = time5 - time4;
        timeLinkedListForeach = time6 - time5;
    }
}

结果数据(单位ms):

timeArrListFor:565

timeArrListForeach:520

timeLinkedListFor:5517

timeLinkedListForeach:323

可见,ArrayList在使用for、foreach循环遍历时,性能差别不大。 但是,LinkedList在使用for、foreach遍历时,性能有15倍左右的差别,而且LinkedList使用foreach遍历性能要好于ArrayList。

结论: 对于有数组使用的场景,如果循环遍历较多,可以多使用LinkedList代替ArrayList。