List接口:
List接口的两个主要实现类:ArrayList & LinkedList
ArrayList:
1》ArrayList 是List接口的可变数组的实现,允许存储NULL在内的所有元素。
2》底层数据结构是数组,数组的元素类型是Object。
3》动态扩容,其增长幅度为原长度0.5倍
4》线程不安全,如果需要保持线程安全可以用 Collections.synchronizedList(List list)来实现
5》查询效率高(因为是基于动态数组,时间复杂度O(1))
6》插入,删除效率低,时间复杂度O(n)
7》扩容的时候,会将老数组中的数据拷贝重写赋值到新数组,代价很高。
LinkedList:
1》LinkedList 是List接口的双向链表的实现。并且运行NULL值
2》底层数据结构是双向链表。
3》线程不安全
4》查询效率低(因为是基于链表实现,查询效率没有数组高)
5》插入,删除效率相对较高。
备注说明:ArrayList 和 LinkedList 在操作复杂度上的区别在于:
1 获取第N个元素 get()
ArrayList 直接根据下标获取 时间复杂度 O(1)
LinkedList 需要遍历复杂度O(n)
2 直接在末尾添加一个元素add(end)
ArrayList 时间复杂度O(1)
LinkedList 时间复杂度O(1)
3 随机添加一个元素 add(index, value)
ArrayList 在index后面添加元素,需要移动index后面的元素 时间复杂度O(n)
LinkedList 需要找到第index个元素,然后将指针指向,复杂度O(n) ,
需要说明:虽然ArrayList 和 LinkedList 的add操作时间复杂度都为O(n)但是 LinkedList不涉及元素移动,只是指针指向。因此它的效率要比ArrayList高
4 删除元素 remove()
ArrayList 删除元素 后面的元素要逐个往前移动一位。因此时间复杂度O(n)
LinkedList 删除元素直接指针指向操作 时间复杂度O(1)