Java中ArrayList和LinkList的区别,Java数据结构性能比较:ArrayList vs LinkedList!

本文详细比较了Java中ArrayList和LinkedList在顺序插入、中间插入、随机插入及删除操作下的性能,指出ArrayList在大多数情况下性能更优,适合顺序和随机操作,而LinkedList在频繁插入/删除和需要高度灵活性的场景有优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

选择合适的数据结构对于优化程序性能至关重要。

在Java中,ArrayListLinkedList是常用的列表实现,它们在插入、删除和迭代等操作上具有不同的性能特点。本文将通过一组测试,对比这两种数据结构在不同场景下的性能表现,以帮助开发者在实际应用中做出明智的选择。

  1. 实验设置:
    在本次实验中,我们使用了一个包含一百万个元素的数据集,分别对ArrayListLinkedList进行了顺序插入、中间插入和删除元素的测试。此外,还进行了五万次随机插入的测试。

  2. 顺序插入性能对比:
    在顺序插入测试中,ArrayListLinkedList分别将一百万个元素顺序插入到列表末尾。根据我们的测试结果,ArrayList的插入耗时仅为0.099秒,而LinkedList为0.152秒。这表明ArrayList在顺序插入方面具有更高的性能。

  3. 中间插入性能对比:
    对于中间插入测试,我们在列表的中间位置插入了三万个元素。结果显示,ArrayList在中间插入方面表现出色,仅需1.817秒,而LinkedList的中间插入耗时则高达122.055秒。这是因为ArrayList在中间插入时只需移动后续元素,而LinkedList需要修改节点指针,导致性能下降。

  4. 随机插入性能对比:
    我们进行了五万次随机插入测试,结果显示ArrayList的性能仍然优于LinkedList。这是因为ArrayList在随机插入时,虽然需要移动后续元素,但其开销相对较小,而LinkedList在随机插入时需要遍历节点找到插入位置,导致性能较差。

  5. 删除性能对比:
    在删除测试中,ArrayListLinkedList都需要删除列表中的所有元素。测试结果显示,ArrayList的删除耗时为0.008秒,而LinkedList为0.01秒。可以看出,两者在删除操作上性能相近。

废话不多说,直接上代码:

public class ListDemo {

    private static final int NUM = 1000000;
    private static final int INSERT = 30000;

    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<>();
        List<String> linkedList = new LinkedList<>();

        // 在列表末尾插入元素
        long start = System.currentTimeMillis();
        for (int i = 0; i < NUM; i++) {
            arrayList.add(String.valueOf(i));
        }
        long end = System.currentTimeMillis();
        double arrayListInsertTime = (double) (end - start) / 1000;
        System.out.println("ArrayList插入耗时: " + arrayListInsertTime + "秒");

        start = System.currentTimeMillis();
        for (int i = 0; i < NUM; i++) {
            linkedList.add(String.valueOf(i));
        }
        end = System.currentTimeMillis();
        double linkedListInsertTime = (double) (end - start) / 1000;
        System.out.println("LinkedList插入耗时: " + linkedListInsertTime + "秒");


        // 在列表中间插入元素
        start = System.currentTimeMillis();
        for (int i = 0; i < INSERT; i++) {
            int index = arrayList.size() / 2;
            arrayList.add(index, String.valueOf(i));
        }
        end = System.currentTimeMillis();
        arrayListInsertTime = (double) (end - start) / 1000;
        System.out.println("ArrayList中间插入耗时: " + arrayListInsertTime + "秒");

        start = System.currentTimeMillis();
        for (int i = 0; i < INSERT; i++) {
            int index = linkedList.size() / 2;
            linkedList.add(index, String.valueOf(i));
        }
        end = System.currentTimeMillis();
        linkedListInsertTime = (double) (end - start) / 1000;
        System.out.println("LinkedList中间插入耗时: " + linkedListInsertTime + "秒");


        // 删除列表中的元素
        start = System.currentTimeMillis();
        for (int i = 0; i < arrayList.size(); i++) {
            arrayList.remove(arrayList.size() - 1);
        }
        end = System.currentTimeMillis();
        double arrayListRemoveTime = (double) (end - start) / 1000;
        System.out.println("ArrayList删除耗时: " + arrayListRemoveTime + "秒");

        start = System.currentTimeMillis();
        for (int i = 0; i < linkedList.size(); i++) {
            linkedList.remove(linkedList.size() - 1);
        }
        end = System.currentTimeMillis();
        double linkedListRemoveTime = (double) (end - start) / 1000;
        System.out.println("LinkedList删除耗时: " + linkedListRemoveTime + "秒");
    }
}

运行结果:

ArrayList插入耗时: 0.099秒
LinkedList插入耗时: 0.152秒
ArrayList中间插入耗时: 1.817秒
LinkedList中间插入耗时: 122.055秒
ArrayList删除耗时: 0.008秒
LinkedList删除耗时: 0.01秒

测试电脑配置参数:

CPU: i7-10875H
内存:DDR4 - 16GB

结论:
根据我们的测试结果,ArrayList在顺序插入、中间插入和随机插入等操作上均显示出更好的性能。然而,LinkedList在频繁的插入和删除操作以及需要高度灵活性和迭代操作的场景下具有一定的优势。因此,在选择数据结构时,应根据具体需求和操作模式进行评估。

总结:
本文通过一组实验测试,对比了ArrayListLinkedList在不同操作下的性能差异。我们发现,ArrayList在插入和删除操作上表现出色,而LinkedList适用于频繁插入和删除、需要高度灵活性和迭代操作的场景。了解这些性能特点,可以帮助开发者在实际应用中做出明智的选择,以提升程序的性能和效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值