有序(输入和输出相同顺序),有下标,可重复,可以有多个null,线程不安全,元素的访问总是从头开始效率 低,但是元素的添加只是地址的内容更改,性能较快。
1.构造函数什么都不做
public LinkedList() {
}
2.添加元素,返回true
public boolean add(E e) {
linkLast(e);
return true;
}
3.将原本的尾节点,保存到常量l,创建新节点,上一个节点为last也就是l内容未添加的元素,下一个节点是null。last 指向刚创建的新节点。判断last节点是否为空,为空则刚添加的是第一个节点first也指向刚刚节点。不是则让last原本 指向的节点(last变啦,但是原本节点位置在l内)指向新节点,这样就串联起来啦。
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
4.内部私有静态类,定义节点类型,每一个数据都打包为这种类型进行存储。
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
简而言之,初始化不做事情,因为是链表,每个元素的添加都是节点的创建与节点的串联。没有过多复杂的扩容,但是指针的赋值逻辑要谨慎。(链表没有下标,但是访问时从头到尾的依次访问,相当于下标的数字的增加,则为虚拟下标)