七的博客

LinkedList跟ArrayList简单的性能测试

源码分析

LinkedList跟ArrayList简单的性能测试

在网上总是看到别人的博客谈到 LinkedListArrayList 的优缺点,自己也是有点背理论的感觉。 干脆今天自己来简单的测试一番,以下数据仅供参考。因为每次测试的时间不是一定会相等的 , 因测试环境的不同导致不同的差异。

测试环境

  • 物理机: 内存12G,四核心/八线程
  • 操作系统: Ubuntu 16.04 LTS X64位
  • JDK: JDK 1.8 X64位
  • IDE: IDEA 2017.1.3 , 启动配置文件如下
-Xms256m
-Xmx1500m
-XX:ReservedCodeCacheSize=480m

测试数据

在有数据的基础上插入数据测试

测试总数据量 测试条件 LinkedList测试结果 ArrayList测试结果
1千万 不指定下标直接插入一条数据 0毫秒
1千万 下标为1的位置插入一条数据 0毫秒 0毫秒
1千万 下标为2000000的位置插入一个数据 19毫秒 25毫秒
1千万 下标为5000000的位置插入一个数据 30毫秒 54毫秒
1千万 下标为7000000的位置插入一个数据 13毫秒 34毫秒
1千万 下标为8020300的位置插入一个数据 8毫秒 21毫秒
1千万 下标为10000000的位置插入一个数据 0毫秒 0毫秒

在无数据的基础上进行插入数据测试

测试条件 LinkedList测试结果 ArrayList测试结果
在空的集合里面插入1千万条数据 4982毫秒 843毫秒

获取数据测试

测试总数据量 测试条件 LinkedList测试结果 ArrayList测试结果
1千万 读取下标为1的位置的数据 0毫秒 0毫秒
1千万 读取下标为1020300的位置的数据 10毫秒 10毫秒
1千万 读取下标为3020300的位置的数据 28毫秒 30毫秒
1千万 读取下标为5000000的位置的数据 34毫秒 47毫秒
1千万 读取下标为8020300的位置的数据 9毫秒 19毫秒
1千万 读取下标为9000000的位置的数据 5毫秒
1千万 读取下标为9020300的位置的数据 6毫秒 9毫秒
1千万 读取下标为10000000的位置的数据 0毫秒 0毫秒

测试代码

测试代码使用的是 Junit + 时间差的方式,这里没有使用 JMH 去测试。

package test.util;

import org.junit.Test;

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.LinkedList;

/**
 * Created by  on 17-8-9
 */
public class ListPerformance {



    /**
     * 在1千万数据里面往下标为1千万的位置插入一个数据
     * 使用LinkedList随机插入数据:0毫秒
     * 使用ArrayList随机地插入数据:0毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test7() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        list.add(10000000,10000000);
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList往下标为1千万的位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        list.add(10000000,10000000);
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList往下标为1千万的位置插入数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面往下标为8020300的位置插入一个数据
     * 使用LinkedList随机插入数据:8毫秒
     * 使用ArrayList随机地插入数据:21毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test10() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        list.add(8020300,10000000);
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList往下标为8020300的位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        list.add(8020300,10000000);
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList往下标为8020300的位置插入数据:" + time2 + "毫秒");

    }



    /**
     * 在1千万数据里面往下标为7000000的位置插入一个数据
     * 使用LinkedList随机插入数据:13毫秒
     * 使用ArrayList随机地插入数据:34毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test21() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        list.add(7000000,10000000);
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList往下标为7000000的位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        list.add(7000000,10000000);
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList往下标为7000000的位置插入数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面往下标为5000000的位置插入一个数据
     * 使用LinkedList随机插入数据:30毫秒
     * 使用ArrayList随机地插入数据:54毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test20() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        list.add(5000000,10000000);
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList往下标为5000000的位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        list.add(5000000,10000000);
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList往下标为5000000的位置插入数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面往下标为2000000的位置插入一个数据
     * 使用LinkedList随机插入数据:19毫秒
     * 使用ArrayList随机地插入数据:25毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test19() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        list.add(2000000,10000000);
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList往下标为2000000的位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        list.add(2000000,10000000);
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList往下标为2000000的位置插入数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面往下标为1的位置插入一个数据
     * 使用LinkedList随机插入数据:0毫秒
     * 使用ArrayList随机地插入数据:0毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test6() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        list.add(1,10000000);
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList往下标为1的位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        list.add(1,10000000);
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList往下标为1的位置插入数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面不指定下标插入一个数据
     * 使用LinkedList随机插入数据:0毫秒
     * 使用ArrayList随机地插入数据:0毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test5() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        list.add(5000000);
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList往下标为1的位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        list.add(5000000);
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList往下标为1的位置插入数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面查找下标为1千万的数据
     * 使用LinkedList随机读取数据:0毫秒
     * 使用ArrayList随机地读取数据:0毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test18() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        Object o1 = list.get(9999999);
        System.out.println(o1.toString());
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList随机读取第1千万位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        Object o2 = list.get(9999999);
        System.out.println(o2.toString());
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList随机地读取第1千万位置数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面查找下标为9020300的数据
     * 使用LinkedList随机读取数据:6毫秒
     * 使用ArrayList随机地读取数据:9毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test15() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        Object o1 = list.get(9020300);
        System.out.println(o1.toString());
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList随机读取第9020300位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        Object o2 = list.get(9020300);
        System.out.println(o2.toString());
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList随机地读取第9020300位置数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面查找下标为8020300的数据
     * 使用LinkedList随机读取数据:9毫秒
     * 使用ArrayList随机地读取数据:19毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test14() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        Object o1 = list.get(8020300);
        System.out.println(o1.toString());
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList随机读取第8020300位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        Object o2 = list.get(8020300);
        System.out.println(o2.toString());
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList随机地读取第8020300位置数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面查找下标为5000000的数据
     * 使用LinkedList随机读取数据:34毫秒
     * 使用ArrayList随机地读取数据:47毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test4() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        Object o1 = list.get(5000000);
        System.out.println(o1.toString());
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList随机读取第5百万位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        Object o2 = list.get(5000000);
        System.out.println(o2.toString());
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList随机地读取第5百万位置数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面查找下标为3020300的数据
     * 使用LinkedList随机读取数据:28毫秒
     * 使用ArrayList随机地读取数据:30毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test16() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        Object o1 = list.get(3020300);
        System.out.println(o1.toString());
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList随机读取第3020300位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        Object o2 = list.get(3020300);
        System.out.println(o2.toString());
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList随机地读取第3020300位置数据:" + time2 + "毫秒");

    }
    /**
     * 在1千万数据里面查找下标为1020300的数据
     * 使用LinkedList随机读取数据:10毫秒
     * 使用ArrayList随机地读取数据:10毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test17() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        Object o1 = list.get(1020300);
        System.out.println(o1.toString());
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList随机读取第1020300位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        Object o2 = list.get(1020300);
        System.out.println(o2.toString());
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList随机地读取第1020300位置数据:" + time2 + "毫秒");

    }


    /**
     * 在1千万数据里面查找下标为1的数据
     * 使用LinkedList随机读取数据:0毫秒
     * 使用ArrayList随机地读取数据:0毫秒
     */
    @SuppressWarnings("Duplicates")
    @Test
    public void test3() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        Object o1 = list.get(1);
        System.out.println(o1.toString());
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList随机读取第1位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        Object o2 = list.get(1);
        System.out.println(o2.toString());
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList随机地读取第1位置数据:" + time2 + "毫秒");

    }

    /**
     * 在1千万数据里面查找第9百万的下标数据
     * 使用LinkedList随机读取数据:5毫秒
     * 使用ArrayList随机地读取数据:9毫秒
     */
    @Test
    public void test2() {
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long begin = System.currentTimeMillis();
        Object o1 = list.get(9000000);
        System.out.println(o1.toString());
        long end = System.currentTimeMillis();
        long time = end - begin;

        System.out.println("使用LinkedList随机读取第9百万下标位置数据:" + time + "毫秒");

        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long begin2 = System.currentTimeMillis();
        Object o2 = list.get(9000000);
        System.out.println(o2.toString());
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;

        System.out.println("使用ArrayList随机地读取第9百万下标位置数据:" + time2 + "毫秒");
        System.out.println("==================");

    }


    /**
     * 正常地测试两个类型对象的插入,插入1千万的数据,连续数据
     * 使用LinkedList正常地使用LinkedList插入数据:4982毫秒
     * 使用ArrayList正常地一个一个插入数据:843毫秒
     */
    @Test
    public void test1() {
        long begin = System.currentTimeMillis();
        LinkedList list = new LinkedList();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println("使用LinkedList正常地使用LinkedList插入数据:" + time + "毫秒");

        long begin2 = System.currentTimeMillis();
        ArrayList<Integer> list2 = new ArrayList();
        for (int i = 0; i < 10000000; i++) {
            list2.add(i);
        }
        long end2 = System.currentTimeMillis();
        long time2 = end2 - begin2;
        System.out.println("使用ArrayList正常地一个一个插入数据:" + time2 + "毫秒");

    }
}