一、介绍:
- LinkedList底层用双向链表实现
- 特点:查询效率低,增删效率高,线程不安全
1、 LinkedList的存储结构图
2、 双链表的结点结构
class Node<E>{
Node<E> previous; //指向前一个结点
E data; //结点内保存的数据
Node<E> nest; //指向后一个结点
}
3、如何选用ArrayList、LinkedList、Vector?
(1)需要线程安全时,用Vector;
(2)不存在线程安全问题时,并且查找较多时用ArrayList(一般使用较多);
(3)不存在线程安全问题时,增加或删除较多用LinkedList。
二、使用:
1、在List标准下的使用
LinkedList实现了List接口,所以LinkedList是具备List的存储特征的(有序、元素可重复)
public class LinkedListTest {
public static void main(String[] args) {
//实例化 LinkedList容器
List<String> list = new LinkedList<>();
//添加元素
boolean a = list.add("a");
boolean b = list.add("b");
boolean c = list.add("c");
list.add(3,"a"); //在链表的指定位置添加元素
System.out.println(a+"\t"+b+"\t"+c);
//获取容器中的所有元素
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)); //i是指结点在链表中的位置
}
}
}
运行结果:
2、在非List标准下的使用:
方法 | 说明 |
---|---|
void addFirst(E) | 将指定元素插入到开头 |
void addLast(E) | 将指定元素插入到结尾 |
getFirst(E) | 返回此链表的第一个元素 |
getLast(E) | 返回此链表的最后一个元素 |
removeFirst() | 移除此链表中的第一个元素,并返回这个元素 |
removeLast() | 移除此链表中的最后一个元素,并返回这个元素 |
pop() | 从此链表所表示的堆栈处弹出一个元素(等效于removeFirst) |
void push(E e) | 将元素推入此链表多表示的堆栈(等效于addFirst(E )) |
(1)测试 addFirst()方法:
public class LinkedListTest2 {
public static void main(String[] args) {
//实例化 linkedList容器
LinkedList<String> list = new LinkedList<>(); //因为要调用的是LinkedList自己的方法,不能用List实例化对象
//将指定元素插入到开头
list.addFirst("a");
list.addFirst("b");
list.addFirst("c");
//遍历链表
for (String str: list) {
System.out.println(str);
}
}
}
(2)测试 addLast()方法:
public class LinkedListTest2 {
public static void main(String[] args) {
//实例化 LinkedList 容器
LinkedList<String> list1 = new LinkedList<>();
//将指定元素添加到结尾
list1.addLast("a");
list1.addLast("b");
list1.addLast("c");
//遍历链表
for (String str:list1) {
System.out.print(str+"\t");
}
}
}
(3)测试 getFirst() 和 getLast() 方法:
//返回此链表的第一个元素
System.out.println("此链表的第一个元素:"+list1.getFirst());
//返回此链表的最后一个元素
System.out.println("此链表的最后一个元素:"+list1.getLast());
(4)测试 removeFirst() 和 removeLast() 方法:
//移除此链表中的第一个元素,并返回这个元素
String s = list1.removeFirst();
System.out.println(s);
//移除此链表中的最后一个元素,并返回这个元素
String s1 = list1.removeLast();
System.out.println(s1);
//遍历链表
System.out.print("剩余链表:");
for (String str:list1) {
System.out.print(str+"\t");
}