一、总体概括
1、基础知识
-
数组:
-
链表:
- 单向链表
- 双向链表
- 单向链表
数组与链表的优缺点:
- 数组
- 优点:
1、随机访问性强
2、查找速度快- 缺点:
1、插入和删除效率低,必须移动数组
2、可能浪费内存
3、内存空间要求高,必须有足够的连续内存空间。
4、数组大小固定,不能动态拓展- 链表
- 优点:
1、插入删除速度快,只需通过指针指向对象地址
2、内存利用率高,不会浪费内存
3、大小没有固定,拓展很灵活- 缺点:
不能随机查找,必须从第一个开始遍历,查找效率低
2、集合框架
3、ArrayList
和LinkedList
在JDK中的位置
4、具体描述
- ArrayList
ArrayList是以
数组
的方式来实现List接口d的,数组的特性是可以使用索引的方式来快速定位对象的位置,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好。
ArrayList是顺序结构,所以定位很快,但插入,删除数据慢。
- LinkedList
LinkedList是采用
双向链表
的方式来实现List接口的,它本身有自己特定的方法. 由于是采用链表实现的,因此在进行insert和remove动作时在效率上要比ArrayList要好得多。
LinkedList 是链表结构,定位慢,但插入,删除数据快。
二、相同点
ArrayList
和LinkedList
都实现了List接口,实现了相同方法:
add()
方法:add 有两种用法:
- 第一种是直接add对象,把对象加在最后面。
- 第二种是在指定位置加对象。
contains()
方法:判断一个对象是否在容器中。
- 判断标准: 是否是同一个对象。
get()
方法: 获取指定位置的对象,但要注意下标越界问题。indexOf()
方法:用于判断一个对象在ArrayList中所处的位置。remove()
方法 :用于把对象从ArrayList中删除。remove
方法:可以根据下标删除ArrayList的元素,也可以根据对象删除。set()
方法: 用于修改指定位置的元素。size()
方法:用于获取ArrayList的大小。toArray()
方法:可以把一个ArrayList对象转换为数组。addAll()
方法: 把另一个容器所有对象都加进来。clear()
方法: 清空一个ArrayList。
三、不同点
实现的接口不同
LinkedList
除了实现了List
接口外,LinkedList
还实现了双向链表结构Deque
,可以很方便的在头尾插入删除数据。LinkedList
除了实现了List
和Deque
外,还实现了Queue
接口(队列)。Queue
是先进先出队列 FIFO,常用方法:offer()
在最后添加元素,poll()
取出第一个元素,peek()
查看第一个元素。数据存储不同
ArrayList
是顺序结构,底层使用数组形式对数据进行存储。LinkedList
是链表结构,底层使用双向链表形式对数据进行存储 。功能效率不同
ArrayList
查询修改快: 数组可以直接通过索引获取对应位置数据。
添加删除慢: 在对首位或中间数据进行添加与删除操作时,需要将之后的数据向后或向前移动,随着数据的增大移动的次数也会增大,导致执行的效率降低。LinkedLis
t
查询修改慢: 底层使用双向链表形式对数据进行存储,每一块只保存当前数据以及前后块地址,在进行查找时,如果查找的是非首末位块,需要依次向后查找。
添加删除快: 链表每块保存数据添加与删除时只影响前后块位置的修改。