八股文之ArrayList和LinkedList的区别

ArrayList和LinkedList是Java中实现List接口的两种集合,它们底层数据结构不同,导致性能特点各异。ArrayList基于数组,适合随机访问但插入、删除慢;LinkedList采用链表,插入、删除快但随机访问效率低。示例代码展示了它们在添加、删除和访问元素时的行为差异。
摘要由CSDN通过智能技术生成

        ArrayList和LinkedList都是Java中常用的集合类型,它们都实现了List接口。它们的主要区别在于底层数据结构不同,因此它们在元素添加、访问、删除等操作时的性能表现也不同。

        ArrayList使用数组作为底层数据结构,因此支持快速随机访问,但在删除、插入等操作时需要移动元素,时间复杂度为O(n);
        LinkedList以双向链表作为底层数据结构,因此插入、删除元素时只需要修改相邻节点的指针,时间复杂度为O(1),但是随机访问元素的效率较低。

下面是一个简单的示例,说明ArrayList和LinkedList之间的区别:

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

public class ArrayListAndLinkedListExample {
    public static void main(String[] args) {
        /* ArrayList */
        List<String> arrayList = new ArrayList<>();
        arrayList.add("apple");
        arrayList.add("banana");
        arrayList.add("kiwifruit");
        arrayList.add("orange");

        System.out.println(arrayList); // 输出为 [apple, banana, kiwifruit, orange]
        System.out.println(arrayList.get(1)); // 输出为 "banana"
        arrayList.set(3, "grapefruit"); // 修改元素
        System.out.println(arrayList); // 输出为 [apple, banana, kiwifruit, grapefruit]
        arrayList.remove(2); // 删除元素
        System.out.println(arrayList); // 输出为 [apple, banana, grapefruit]

        /* LinkedList */
        List<String> linkedList = new LinkedList<>();
        linkedList.add("apple");
        linkedList.add("banana");
        linkedList.add("kiwifruit");
        linkedList.add("orange");

        System.out.println(linkedList); // 输出为 [apple, banana, kiwifruit, orange]
        System.out.println(linkedList.get(1)); // 输出为 "banana"
        linkedList.set(3, "grapefruit"); // 修改元素
        System.out.println(linkedList); // 输出为 [apple, banana, kiwifruit, grapefruit]
        linkedList.remove(2); // 删除元素
        System.out.println(linkedList); // 输出为 [apple, banana, grapefruit]
    }
}

 

        在这个例子中,我们分别创建了一个ArrayList类型的arrayList和一个LinkedList类型的linkedList,然后往它们中添加了一些元素,对它们进行访问、修改、删除等基本操作。从输出结果可以看出,在相同的操作下,ArrayList通常比LinkedList运行更快,但是在某些特定场景下(如频繁插入删除元素时),LinkedList的效率更高。

        上面举的这个例子中并没有体现出ArrayLis在删除、插入等操作时需要移动元素。再举一个:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ArrayListPerformance {
    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList<>();

        /* 添加元素 */
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            arrayList.add(i);
        }
        long end = System.currentTimeMillis();
        System.out.println("添加100000个元素所需时间:" + (end - start));

        /* 删除元素 */
        start = System.currentTimeMillis();
        Iterator<Integer> iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            int num = iterator.next();
            if (num % 2 == 0) {
                iterator.remove();
            }
        }
        end = System.currentTimeMillis();
        System.out.println("删除偶数元素所需时间:" + (end - start));
    }
}

        在这个示例中,我们创建了一个包含100000个元素的ArrayList,并分别测试了它们的添加、删除偶数元素的效率。运行一下代码,就可以看到在删除元素的操作中,ArrayList确实要进行大量的数组元素移动,因此删除的时间代价较高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值