JAVA-容器四LinKedList{容器-单例集合-Stack}JAVA从基础开始 --6
LinKedList
Linkedlist底层用双向链表实现的存储。特点:查询效率低,增删效率髙,线程不安全双向链表也叫双链表,是链表的—种,它的毎个数据节点中都有两个指针,分别指向前一个节点和后一个节点。所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。
数组因为使用索引来查询元素,所以查询效率高,而增删改会把所有的索引全部跟新,所以增删改效率低
链表是没有下标的,只有节点(node)(类似车厢),查询时候,只能一节一节来找,双向链表,是头尾互相相连,所以查询效率低。
class Node<E>{
E item;
Node<E> next;
Node<E> prev;
}
Linkedlist使用,List标准
Linkedlist实现了List接口,所以其具备List特征(有序,元素有重复)
package top.baokeaia;
import java.util.LinkedList;
import java.util.List;
public class LinkedListTest {
public static void main(String[] args) {
List<String> l = new LinkedList<>();
//添加元素
l.add("a");
l.add("b");
l.add("c");
l.add("b");
//遍历 没有下标要给定位置
int size = l.size();
for (int i = 0; i < size; i++) {
System.out.println(l.get(i));
}
for (String str : l) {
System.out.println(str);
}
}
}
Linkedlist使用,非List标准
方法:
LinkedList<String> lk = new LinkedList<>();
lk.addLast("a");
lk.addLast("b");
lk.addLast("c");
for (String str : lk) {
System.out.println(str);
}
LinkedList<String> lk = new LinkedList<>();
lk.addFirst("a");
lk.addFirst("b");
lk.addFirst("c");
for (String str : lk) {
System.out.println(str);
}
可以看出取出的时候是后进先出原则
源码分析
双向链表存储的特点:
一个节点需要存放3部分值, 上一个节点地址,value,下一个节点的地址
若上一个或下一个没节点,就其地址为空
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;
}
}
因为他是LinkedList独有且只有LinkedList需要用,所以它是一个静态的内部类。
在List中的add方法实现
public boolean add(E e) {
linkLast(e);
return true;
}
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++;
}