让星星⭐月亮告诉你,LinkedList和ArrayList(指定位置/头尾增加删除)

简介: 这段代码通过对比 `ArrayList` 和 `LinkedList` 在不同位置插入和删除数据的性能,展示了两者在不同操作下的优劣。`LinkedList` 在头部插入数据时效率高,但在尾部插入或指定位置插入时耗时较多,因为需要移动指针。`ArrayList` 则在任何位置插入数据时耗时相对稳定,但头部插入需要移动大量数据。删除操作中,`LinkedList` 在指定位置删除数据时耗时较少,而 `ArrayList` 需要移动数据。代码中通过多次插入和删除操作,统计并输出了具体的耗时情况。

⭐⭐⭐代码执行结论🌙🌙🌙:

/*
现象:LinkedList在指定位置采用add(index,data)方式增加数据时,位置越靠前耗时越少,越靠后耗时越多(而ArrayList采用add(index,data)方式的耗时跟位置关系不大);
原因:虽说LinkedList底层属于链表数据结构,不需要开辟一块连续的内存地址空间,逻辑上连续即可,在新增、插入和删除操作上占优势(只需要修改节点的前后指向即可,不需要移动数据);
但是因为LinkedList在插入时需要先移动指针到指定节点, 才能开始插入,一旦要插入的位置比较远,LinkedList就需要一步一步的移动指针, 直到移动到插入位置;
这就解释了, 为什么节点所在位置越靠后, 耗时越长, 因为指针移动需要时间。而ArrayList是数组结构, 可以根据下标直接获得位置, 这就省去了查找特定节点的时间,所以对ArrayList的影响不是特别大。

现象:LinkedList在头部add数据时(采用add(0,data)和addFirst(data)两种方式耗时差不多,都很少),耗时远远低于ArrayList(采用add(0,data));
原因:不像指定位置一样不需要移动指针,也不需要像ArrayList一样由于连续地址的原因移动数据。

现象:LinkedList在尾部add数据时采用指定位置add(lastIndex,data)的方式,ArrayList在尾部add数据时采用指定位置add(index,data)的方式,则LinkedList耗时远远高于ArrayList;
原因:跟在指定位置add(index,data)数据类似,越靠后LinkedList需要移动指针所花费的时间越多,而ArrayList查找效率本身就很高。

现象:LinkedList在尾部add数据时,如果采用addLast(data)的方式,ArrayList在尾部add数据时采用add(i)的方式,则LinkedList与ArrayList的耗时差不多;且两者的效率都比使用指定位置的方式有了极大提升
原因:LinkedList不像指定位置的方式那样,不再需要移动指针到指定位置;ArrayList不再像指定位置的方式那样,不再需要查询索引位置。

现象:LinkedList在remove(index)指定位置的数据时,位置越靠前耗时越少,越靠后耗时越多;
原因:跟在指定位置插入数据类似,越靠后移动指针所花费的时间越多。

现象:LinkedList在remove(Object)指定的数据时,耗时远少于ArrayList;
原因:不像指定位置一样不需要移动指针,也不需要像ArrayList一样由于连续地址的原因移动数据。
*/

public class TestArrayList {
   
    private static final int index = 100000;
    static List<Integer> list = null;
    public static void main(String[] args) {
   
        //测试ArrayList和LinkedList的插入效率
        addElementInList(list, "ArrayList");
        addElementInList(list, "LinkedList");
        //测试ArrayList和LinkedList的查询效率

    }

    private static void addElementInList(List<Integer> list, String type){
   
        if(type == "ArrayList"){
   
            list = new ArrayList();
            for(int i = 0; i < index; i++){
   
                list.add(i);
            }
        }
        if(type == "LinkedList"){
   
            list = new LinkedList();
            for(int i = 0; i < index; i++){
   
                list.add(i);
            }
        }
        long begin = System.currentTimeMillis();
//        int n = 20000;
        int n = index;
//        int n = 0;
        for(int i = 0; i < index; i++){
   
            if(type == "LinkedList"){
   
                list.add(n,i);
//                ((LinkedList)list).addLast(i);
//                ((LinkedList)list).addFirst(i);
            }else{
   
                list.add(n,i);
//                list.add(i);
            }
        }

        long end = System.currentTimeMillis();
        System.out.printf("在%s集合的索引为%d的位置插入%d条数据,总耗时为%d毫秒\n", type,n, index, end - begin);


        /*long begin2 = System.currentTimeMillis();
        for(int i = 0; i < index/6; i++){
            if(type == "LinkedList"){
                ((LinkedList)list).remove(i);
//                ((LinkedList)list).remove((Object)i);
//                ((LinkedList)list).remove();
            }else{
                ((ArrayList)list).remove(i);
//                ((ArrayList)list).remove((Object)i);
            }
        }
        long end2 = System.currentTimeMillis();
        System.out.printf("在%s集合remove(index)%d条数据,总耗时为%d毫秒\n", type, index, end2 - begin2);*/

        long begin2 = System.currentTimeMillis();
        for(int i = 0; i < index; i++){
   
            if(type == "LinkedList"){
   
//                ((LinkedList)list).remove(i);
                ((LinkedList)list).remove((Object)i);
//                ((LinkedList)list).remove();
            }else{
   
//                ((ArrayList)list).remove(i);
                ((ArrayList)list).remove((Object)i);
            }
        }
        long end2 = System.currentTimeMillis();
        System.out.printf("在%s集合remove(Object)%d条数据,总耗时为%d毫秒\n", type, index, end2 - begin2);
    }

}
目录
相关文章
|
2月前
|
Java 索引
让星星⭐月亮告诉你,HashMap之往红黑树添加元素-putTreeVal方法源码解读
本文详细解析了Java `HashMap` 中 `putTreeVal` 方法的源码,该方法用于在红黑树中添加元素。当数组索引位置已存在红黑树类型的元素时,会调用此方法。具体步骤包括:从根节点开始遍历红黑树,找到合适位置插入新元素,调整节点指针,保持红黑树平衡,并确保根节点是链表头节点。通过源码解析,帮助读者深入理解 `HashMap` 的内部实现机制。
35 2
|
2月前
|
Java C++ 索引
让星星⭐月亮告诉你,LinkedList和ArrayList底层数据结构及方法源码说明
`LinkedList` 和 `ArrayList` 是 Java 中两种常见的列表实现。`LinkedList` 基于双向链表,适合频繁的插入和删除操作,但按索引访问元素效率较低。`ArrayList` 基于动态数组,支持快速随机访问,但在中间位置插入或删除元素时性能较差。两者均实现了 `List` 接口,`LinkedList` 还额外实现了 `Deque` 接口,提供了更多队列操作。
26 3
|
2月前
|
存储 索引
让星星⭐月亮告诉你,HashMap在put数据时是如何找到要存放的位置的?
HashMap 是一种常用的键值对存储结构,其底层采用数组+链表+红黑树实现。本文探讨了 HashMap 在插入键值对时如何确定存放位置。通过分析 `put` 方法的源代码,重点解析了哈希码的计算过程和数组索引的确定方法。哈希码通过 `hashCode()` 方法和位运算优化,确保均匀分布,从而减少哈希碰撞,提高性能。最终,通过 `(n-1) & hash` 计算出数组索引,确保键值对被正确存放到指定位置。
35 2
|
6月前
|
索引
leetcode题解:27.移除元素
leetcode题解:27.移除元素
34 0
|
7月前
leetcode代码记录(移除链表元素
leetcode代码记录(移除链表元素
33 0
|
7月前
leetcode代码记录(移除元素
leetcode代码记录(移除元素
35 0
每日一题——leetcode基础题之移除链表元素
每日一题——leetcode基础题之移除链表元素
36 0
每日一题——leetcode基础题之移除链表元素
|
算法 Go C++
【面试必刷TOP101】 删除有序链表中重复的元素-I & 删除有序链表中重复的元素-II
【面试必刷TOP101】 删除有序链表中重复的元素-I & 删除有序链表中重复的元素-II
51 0
|
测试技术
每日一题(移除链表元素)
每日一题(移除链表元素)
每日一题——删除链表中重复的元素——II
每日一题——删除链表中重复的元素——II