ArrayList和LinkedList在中间开始插入的快慢比较

本文通过实验对比ArrayList和LinkedList在中间插入数据时的速度差异。结果表明,插入位置的选择对LinkedList性能影响显著,当插入位置较远时,LinkedList由于需要移动指针而耗时较长。相比之下,ArrayList能直接通过下标定位,对于查询操作更为高效。因此,ArrayList适合查询操作,而LinkedList在增删操作中更具优势。

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

首先创建带数据的两个List, 然后在中间插入数据, 观察完成时间

public class Hero {
        public static void main(String[] args){
            listAndLink();
        }
                public static void listAndLink(){
            List<String> list = new ArrayList<String>();
            LinkedList<String> link = new LinkedList<String>();
            //生产数据
            for(int i = 0; i < 100000; i ++){
                list.add("dfghdffdhghdfghdfghians"+i);
                link.add("dfghdffdhghdfghdfghians"+i);
            }
            //标记开始时间
            long startlist = System.currentTimeMillis();
            //在list中间插入数据
            for(int i = 0; i < 10000; i ++){
                list.add((5000+i), "asdfasdfaasdf");
          
### Java 中 ArrayListLinkedList 插入删除操作性能比较 对于 `ArrayList` 而言,在列表中间执行插入或移除元素的操作效率较低。因为这些操作会触发数组内部元素的大规模移动来维持连续存储特性,时间复杂度为 O(n)[^1]。 相比之下,`LinkedList` 是基于双向链表实现的数据结构。这使得它在处理频繁的插入删除场景时表现更优,尤其是在已知位置的情况下。由于只需要调整相邻节点之间的指针而不需要搬移数据项,因此这类操作的时间复杂度可以达到 O(1),但前提是已经定位到目标节点的位置[^2]。 然而值得注意的是,如果要访问特定索引处的元素,则 `ArrayList` 显著优于 `LinkedList` 。因为在链表中查找指定下标的节点同样需要遍历整个链条直至找到对应位置,其平均情况下也需要 O(n) 时间开销;而对于数组来说,通过计算偏移量即可瞬间完成随机存取,即拥有常数级别的访问速度 O(1)。 综上所述: - 当涉及到大量顺序读写以及较少变动的情况时推荐使用 `ArrayList` - 如果应用程序涉及较多动态变化(特别是两端增删),则更适合选用 `LinkedList` 下面给出一段简单的测试代码用于对比两者在相同条件下进行多次插入后的耗时情况: ```java import java.util.ArrayList; import java.util.LinkedList; public class ListPerformanceTest { public static void main(String[] args) throws InterruptedException { int testSize = 100_000; // 测试样本大小 long startTime, endTime; // 对于 ArrayList插入测试 ArrayList<Integer> arrayList = new ArrayList<>(); startTime = System.currentTimeMillis(); for (int i = 0; i < testSize; ++i){ arrayList.add(i); } endTime = System.currentTimeMillis(); System.out.println("ArrayList insert time cost:"+(endTime-startTime)+"ms"); // 对于 LinkedList插入测试 LinkedList<Integer> linkedList = new LinkedList<>(); startTime = System.currentTimeMillis(); for (int i = 0; i < testSize; ++i){ linkedList.add(i); } endTime = System.currentTimeMillis(); System.out.println("LinkedList insert time cost:"+(endTime-startTime)+"ms"); } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值