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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> ArrayList和LinkedList区别 -> 正文阅读

[数据结构与算法]ArrayList和LinkedList区别


一、ArrayList是什么?

ArrayList内部是动态数组的结构,具备数组的特点
优点:

1)查找速度快
2)随机访问性强
3)尾插速度快,时间复杂为O(N)

缺点:

1)头插、中间插入和删除操作时需要搬运数据,时间复杂度是O(N)
2) 数组需要连续的内存空间,对空间要求高
3) 数组是固定大小的,但是ArrayList 插入元素会触发扩容机制

常用的方法
1)add( element) 添加一个元素,
2)add( index , element) 在index位置添加一个元素 index当前元素就会往后挪
3)size() 顺序表长度
4) set (index ,element) 将index位置元素进行修改
5)get( index) 获取index位置的元素
6)remove(index) 删除index 位置的元素
7)contains (element) 是否包含该元素
8)isEmpry() 判断顺序表是否为空

ArrayList 的扩容机制

总体来说就是把数组复制到另外一个内存空间更大的数组中
若只是创建了对象没有添加元素,此时的大小为0,如果我们没有指定大小,此时默认大小为10
扩容时机
如果当前数组大小大于数组初识容量(比如初识容量为10,当添加第11个元素时)就会进行扩容,新的容量为旧的容量的1.5倍
扩容方式
扩容时,会以新的容量创建一个原数组的拷贝,将原数组的数据拷贝过来,原数组就会被抛弃,会被GC回收

二、LinkedList

LinkedList 底层通过双向链表实现 LinkedList 通过first 和 last 引用分别指向链表的第一个和最后一个元素

双向链表的优点:

1.内存利用率高,不会浪费内存
2.大小不固定,拓展灵活
3.插入、删除头尾速度快,时间复杂度为O(1)

缺点:

在Java中LinkedList 中间位置插入元素,时间复杂度为O(N),且不能随机查找,必须遍历链表

常用的方法
1)add( element ) 添加一个元素
2)addFirst (element) 头插一个元素
3)addLast (element) 尾插一个元素
4)get( index) 获取index 位置的元素
5)set(index element) 设置index位置元素为 element
6)indexOf(element) 返回该元素所在下标,没找到就返回-1
7)contains (element) 判断是否有该元素

LinkedList 和链表的区别

平时我们说的链表是单链表而LinkedList 是具体的,特指Java标准库的某个集合类
举一个简单的例子:
给定一个单向链表,删除最后一个节点,时间复杂度是O(N)
给定一个LinkedList,删除最后一个节点,时间复杂度为O(1)

三、ArrayList和LinkedList区别

这里我们从二者增删改查的方面进行对比

增加元素:

1.头插/尾插
ArrayList 头插要进行大量的挪元素时间复杂度为O(N) 而尾插根据下标就能直接插入O(1)
LinkedList 因为是双向链表,有节点进行记录所以时间复杂度为O(1)
2.中间位置插入
ArrayList 在中间位置插入元素,需要挪元素 ,时间复杂度为O(N)
LinkedList 在中间位置插入元素,需要遍历链表去找位置,时间复杂度也为O(N)

总结:增加元素时,LinkedList 表现更好,因为ArrayList 插入元素需要进行挪元素,而LinkedList 只需要修改地址值,而且头插和尾插速度快,所以LinkedList 表现更佳

删除元素

1.给定位置删除
ArrayList 因为有下标的存在,能很快找到位置,但是要进行挪元素,只有删除最后一个才不需要挪元素,时间复杂度为O(N)
LinkedList 删除给定位置,需要遍历链表来找到位置,所以时间复杂度为O(N)

2.给定值删除
都需要遍历来找到值,所有时间复杂度为O(N)

总结:删除元素LinkedList要优于ArrayList ,因为找到待删除的元素后,ArrayList 需要挪元素,但是LinkedList 只需要修改地址值

修改元素

1.给定位置修改
ArrayList 直接找到位置,进行修改,时间复杂度为O(1)
而LinkedList 需要遍历找位置 ,时间复杂度为O(N)

2.给定值修改
都需要遍历去修改,时间复杂度为O(N)

总结:修改元素ArrayList 因为有随机访问能力,所有在给定位置进行修改表现更好,但是二者修改给定位置速度差不多,都要遍历

查找元素

1.给定位置查找
ArrayList 有随机查找能力,时间复杂度为O(1)
LinkedList 只能遍历查找,时间复杂度为O (N)

2.给定值查找
都需要遍历查找, 时间复杂度为O(N)

总结查找元素,毋庸置疑ArrayList更好,具有随机访问的能力,时间复杂为O(1)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 15:22:16  更:2021-08-20 15:24:22 
 
开发: 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/25 22:22:56-

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