1、ArrayList
底层数据结构为 Object 类型数组,所有可以添加到底层数组数据的方法,都有对应的泛型约束,保证数据类型,支持多样性的同时,满足数据类型完全一致化(add addAll set) ,同时获取集合底层数组数据的方法返回值类型也有对应的泛型约束,满足数据类型一致化(remove(int) set get)
底层 Object 类型数组依赖于 grow 方法可以满足容量扩容操作,每次扩容的容量大约是原容量的1.5倍左右,如果扩容1.5倍无法满足当前需求,就按照当前添加操作所需的最小容量来进行新数组创建和扩容操作
ArrayList 构造方法
ArrayList(); 底层 Object 数组默认容量为 10 DEFAULT_CAPACITY
ArrayList(int initCapacity);性能:
增删慢
1、增加操作有可能触发底层数组扩容,扩容操作对于【时间效率较低】
【空间效率较低】
2、除增加操作在数组的末尾【尾插法】对于性能影响不大,如果在数组指定下
标位置添加元素,数组中的元素内容整体向后移动,移动过程【时间效率较低】
3、删除操作在数组的末尾进行删除操作,性能ok,但是一旦删除数组中的指定
下标操作,数组中的元素整体向前移动,移动过程中【时间效率底】
4、删除操作有可能会导致数组有效元素个数和总容量的比例降低,同时有可能
触发空闲容量超出【阈值】
查询快
底层为数组结构,数据存储空间连续,且可以根据下标+数组首地址方式快速计
算元素所在的空间位置,CPU快速寻址,效率极高。
2、LinkedList
带有链表头的双向链表结构
class LinkedList {
Node<E> first;
Node<E> last;
int size;
}
class Node<E> {
Node<E> prev;
E e;
Node<E> next;
}
性能
增删快
增加和删除操作节点。有且只是对于节点直接的进行赋值操作,调正结点中
next 和 prev 指向关系,不涉及数据移动和底层数据扩容
查询慢
如果操作LinkedList 中间的结点元素,我们需要从头节点或者尾结点开始挨个跳
转找到目标元素,效率极低,但是操作头节点和尾结点效率极高