IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [Java算法技巧] - 答题的时候什么时候用 LinkedList 和 ArrayList -> 正文阅读

[数据结构与算法][Java算法技巧] - 答题的时候什么时候用 LinkedList 和 ArrayList

结论:单纯的添加、随机读取和遍历使用 ArrayList (单纯使用List作为存储数据结构时使用 ArrayList),如果有大量的随机写入和删除操作则使用 LinkedList

ArrayList 和 LinkedList 都实现了集合中 List 接口。LinkedList 使用双链表实现。 ArrayList 通过一个动态数组实现。


LinkedList 的方法时间复杂度

get:O(n)-(平均 n / 4 步)
add:O(1)
add(指定位置):O(n)(平均n / 4步)-(首位添加是O(1))
remove(指定位置) :O(n)-(平均n / 4步)
Iterator.remove:O(1)
ListIterator.add:O(1)
注意:许多操作平均需要n / 4步,最佳情况下的步数为常数(例如,索引= 0),最坏情况下为n / 2步(列表中部)

ArrayList 的方法时间复杂度

get(指定位置):O(1)
add:O(1)首尾,但O(n)最坏的情况,超出容量时数组必须调整大小并复制
add(指定位置):O(n)-(平均n / 2步)
remove(指定位置):O(n)-(平均n / 2步)
Iterator.remove():O(n)-(平均n / 2步)
ListIterator.add():O(n)-(平均n / 2步)
注意:许多操作平均需要n / 2步,在容量内是最佳情况O(1),超容需要复制,最差情况O(n)


10w级读写测试:

public static void main(String[] args) throws InterruptedException {
        LinkedList<Integer> linkedList = new LinkedList<>();
        ArrayList<Integer> arrayList = new ArrayList<>();

        // 插入数据测试
        long startLinked = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            linkedList.add(i);
        }
        long endLinked = System.currentTimeMillis();
        System.out.println("添加数据 LinkedList: " + (endLinked - startLinked) + " 毫秒");
        Thread.sleep(1000);
        long startArray = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            arrayList.add(i);
        }
        long endArray = System.currentTimeMillis();
        System.out.println("添加数据 ArrayList: " + (endArray - startArray) + " 毫秒");
        Thread.sleep(1000);
        // 使用遍历访问数据
        long startL = System.currentTimeMillis();
        for (int i = 0; i < linkedList.size(); i++) {
            int tmp = linkedList.get(i);
        }
        long endL = System.currentTimeMillis();
        System.out.println("查询数据 LinkedList: " + (endL - startL) + " 毫秒");
        Thread.sleep(1000);
        long startA = System.currentTimeMillis();
        for (int i = 0; i < arrayList.size(); i++) {
            int tmp = arrayList.get(i);
        }
        long endA = System.currentTimeMillis();
        System.out.println("查询数据 ArrayList: " + (endA - startA) + " 毫秒");
    }

结果(时间有浮动,但是LinkedList 整体比 ArrayList 慢):

添加数据 LinkedList: 11 毫秒
添加数据 ArrayList: 0 毫秒
查询数据 LinkedList: 4852 毫秒
查询数据 ArrayList: 0 毫秒
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:01:52  更:2022-04-26 12:06:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:46:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码