【Java程序优化】- 深度剖析 List 性能分析

本文深入探讨了ArrayList和LinkedList两种List实现的性能差异,包括添加、删除元素、容量参数以及遍历方式。在尾部添加元素时,ArrayList表现优秀,而插入中间位置时,LinkedList更占优势。合理设置容量参数有助于提升ArrayList性能,遍历方面,for循环效率高于迭代器和ForEach。
摘要由CSDN通过智能技术生成

List 是重要的数据结构之一。最常用的的便是: ArrayList、Vector 和 LinkedList 三种了,他们类图如下图所示:


由上图可知,这三种 List 都实现了 Collection 和 List 接口。

这三种不同的实现中,ArrayList 和 Vector 使用了数组实现,封装了对内部数组的操作。它们俩唯一的区别是 ArrayList 没有任何一个方法是同步的,而 Vector 则是做了线程同步。我们之后均以 ArrayList 为例进行讲解。

LinkList 使用了双向链表数据结构,并且维护了 first 和 last 两个成员变量来指示链表的头和尾。这和 ArrayList 是截然不同的实现技术,也决定了它们适用于不同的场景中。

LinkedList 是由一系列表项连接而成的。一个表项总是分为三个部分,分别是:元素内容,前驱表项 和 后驱表项,如下图所示:


在 JDK 的视线中,不管 LinkedList 是否为空,链表中总是有一个 header 表项,它即表示链表的开始,也表示链表的结尾。

下面以增加和删除为例,比较 ArrayList 和 LinkList 的不同之处。

1、增加元素到列表尾端

在 ArrayList 中增加元素到队列端尾的代码如下:

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // 确保内部数组有足够的空间
        elementData[size++] = e;
        return true;
    }


ArrayList 中 add() 方法的性能取决于 ensureCapacity() 方法。ensureCapacity() 的实现如下:
	/**
	 * 分配的最大内存。
	 * 有些虚拟机会为数组保留了一些头部内容,试图分配更多的空间会引起内存溢出
     */
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    
    private void ensureCapacityInternal(int minCapacity) {
        modCount++;
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1); //计划扩容到现在容量的1.5倍
        if (newCapacity - minCapacity < 0) //如果新容量小于最小需要的
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值