Arraylist与linkedList比较

本文通过实验对比了ArrayList与LinkedList两种数据结构在添加与查找操作上的性能差异。结果显示,在进行频繁的头部插入操作时,LinkedList表现出明显优势;而在随机访问方面,ArrayList则更胜一筹。

arraylist是基于动态数组的数据结构

linkedList是基于链表的数据结构

在随机访问get,set的时候arraylist性能高于linkdlist 因为linkedList移动指针

在执行删除,新增操作时候linkedlist性能高于arraylist 因为arraylist移动数据

package com.company.list;

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

/**
 * Created by zkc on 2017/7/13.
 */
public class ArrayListAndLinkList
{
    static final int N=100000;
    static long timeList(List list){
        long start=System.currentTimeMillis();
        Object o = new Object();
        for(int i=0;i<N;i++) {
            list.add(0, o);
        }
        return System.currentTimeMillis()-start;
    }
    static long readList(List list){
        long start=System.currentTimeMillis();
        for(int i=0,j=list.size();i<j;i++){

        }
        return System.currentTimeMillis()-start;
    }

    static List addList(List list){
        Object o = new Object();
        for(int i=0;i<N;i++) {
            list.add(0, o);
        }
        return list;
    }
    public static void main(String[] args) {
        System.out.println("ArrayList添加"+N+"条耗时:"+timeList(new ArrayList()));
        System.out.println("LinkedList添加"+N+"条耗时:"+timeList(new LinkedList()));

        List list1=addList(new ArrayList<>());
        List list2=addList(new LinkedList<>());
        System.out.println("ArrayList查找"+N+"条耗时:"+readList(list1));
        System.out.println("LinkedList查找"+N+"条耗时:"+timeList(list2));
    }
}


result:

ArrayList添加100000条耗时:1391
LinkedList添加100000条耗时:0
ArrayList查找100000条耗时:0
LinkedList查找100000条耗时:15


### ArrayList LinkedList 的性能比较 #### 访问时间 `ArrayList` 提供基于索引的快速随机访问能力,其底层由数组支持,因此可以通过计算偏移量直接定位到目标位置[^1]。相比之下,`LinkedList` 是一种双向链表结构,在访问特定索引处的元素时需要从头节点或尾节点开始遍历,直到找到目标节点为止,这使得它的访问速度较慢。 #### 插入/删除效率 对于 `LinkedList` 而言,由于它不需要移动任何现有数据即可完成插入或者删除动作(只需调整相邻结点之间的指针关系),所以在执行这些操作方面表现得更加高效特别是当涉及到大量中间位置上的变动时更为明显[^2]。然而,如果只是简单地向末尾追加新项,则两者差异不大;但对于大规模连续区域内的修改行为来说,`ArrayList` 需要付出更多代价来进行整体迁移工作以维持顺序性[^3]。 #### 内存占用情况 尽管每次扩容都会带来额外开销,但在大多数情况下,默认初始容量已经足够满足一般需求,并且随着规模增长而动态扩展也相对灵活可控。另一方面,因为每个链接都需要保存前后两个方向的信息以及自身的值字段,所以即使是在相同数量级下储存同样内容的数据集里,`LinkedList` 所消耗的空间通常会大于 `ArrayList`[^4]。 ### 使用场景推荐 - **选择 ArrayList** - 数据主要集中在读取而非写入更新频率较高的场合; - 对于那些更看重查找速度而不是频繁变更的应用程序而言是一个不错的选择。 - **选用 LinkedList** - 如果应用程序中有大量的插入删除请求发生在序列的不同地方尤其是中部附近的话可以考虑采用此容器类型; - 在某些特殊条件下比如实现队列(FIFO) 或者栈(LIFO),利用其天然特性能够简化逻辑设计并提高运行效能。 ```java // 创建线程安全的 ArrayList 示例 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ThreadSafeArrayListExample { public static void main(String[] args) { List<String> synchronizedArrayList = Collections.synchronizedList(new ArrayList<>()); // 多线程环境下的安全操作... } } // 泛型使用的例子 import java.util.ArrayList; import java.util.List; public class GenericListExample { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie"); for (String name : names) { System.out.println(name); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值