java集合篇-List
单链表:
单链表(单向链表):由两部分组成 数据域(Data)和结点域(Node),单链表就像是一条打了很多结的绳子,每一个绳结相当于一个结点,每个节结点间都有绳子连接,这样原理的实现是通过Node结点区的头指针head实现的,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向为null,这样一来就连成了上述所说绳子一样的链,对单链表的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。
双链表
双链表(双向链表):双链表和单链表相比,多了一个指向尾指针(tail),双链表的每个结点都有一个头指针head和尾指针tail,双链表相比单链表更容易操作,双链表结点的首结点的head指向为null,tail指向下一个节点的tail;尾结点的head指向前一个结点的head,tail 指向为null,是双向的关系;
在单链表中若需要查找某一个元素时,都必须从第一个元素开始进行查找,而双向链表除开头节点和最后一个节点外每个节点中储存有两个指针,这连个指针分别指向前一个节点的地址和后一个节点的地址,这样无论通过那个节点都能够寻找到其他的节点。
ArrayList
ArrayList 基于数组实现,无容量限制,非线程安全。
在执行插入元素时可能要扩容,在删除源数时并不会减小数据在容量。
(1)ArrayList遍历比较快,随机存取元素时间复杂度O(1),插入删除操作效率低 因为需要大量移动元素。
(2)为节省内存,当新容器为空时,会共享。
Object[] EMPTY_ELEMENTDATA = {}
和
Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}
空数组
(3)容器采用数组存储,当数组的大小大于初始容量的时候(比如初始为10,当添加第11个元素的时候),就会进行扩容,新的容量为旧的容量的1.5倍。
LinkedList
LinkedList 基于双向链表。允许所有元素为null, 插入删除不需要移动元素外,可以原地插入删除,可以在结构的前后插入数据,可以双向遍历
Vector
基于synchronized实现的线程安全的ArrayList,但在插入元素时容量扩充的机制和ArrayList稍有不同,并可通过传入capacityIncrement来控制容量的扩充。线程安全,比较慢