按照之前的套路,还是先研究一下源码啦~ 这样就能对它的实现以及方法等等有一个详细的理解,虽然看源码比较头疼,但是!!!还是得看的!!!人家为什么是源码呢??大神的思路当然值得我们学习了 ~o(╥﹏╥)o
一、继承关系
可以看见它实现了Deque接口,所以具有队列先进先出的特征。
并且因此还提供了特殊的方法,比如从头或者尾进行添加、删除、获取
二、基本属性
transient int size = 0; //集合中元素个数
transient Node<E> first; //头结点
transient Node<E> last; //尾结点
三、底层数据结构
所以呢 底层数据是一个双向链表
四、构造函数
- 无参构造函数
- 有参构造函数
五、CRUD方法研究
1、add():添加元素
LinkedList提供头插,尾插方式插入节点,但是默认采用的是尾插 。
2、get():获取元素
如果要获取index位置上的元素,先看是否小于size的一半,如果小于从0号开始查找,否则从size-1开始查找
3、remove():删除元素
public boolean remove(Object o) {
//判断元素是否为null进行不同的判等处理
//删除元素从前往后删除,重复性元素直接删除第一个节点
if (o == null) { //为空用==
for (Node<E> x = first; x != null; x = x.next) {
if (x.item == null) {
unlink(x);
return true;
}
}
} else {
for (Node<E> x = first; x != null; x = x.next) {
if (o.equals(x.item)) { //不为空用equals
unlink(x);
return true;
}
}
}
return false;
}
E unlink(Node<E> x) {
// assert x != null;
final E element = x.item;
final Node<E> next = x.next;
final Node<E> prev = x.prev;
//前驱prev分两种情况:一种是first节点,一种非first节点
if (prev == null) {
first = next;
} else {
prev.next = next;
x.prev = null;
}
//后继next分两种情况:一种是last节点,一种是非last节点
if (next == null) {
last = prev;
} else {
next.prev = prev;
x.next = null;
}
//将元素置为null
x.item = null;
size--;
modCount++;
return element;
}
六、LinkedList应用实例
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<Integer> linkedList = new LinkedList<>();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.add(null);
linkedList.add(3);
System.out.println(linkedList);
System.out.println("0号下标的元素为:"+linkedList.get(0));
System.out.println("删除3号元素,再次遍历:");
linkedList.remove(Integer.valueOf(3));
Iterator<Integer> iterator = linkedList.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
}
}
七、ArrayList与LinkedList的异同点
相同点
- 继承关系: 都是List接口下的实现类,具有list提供的所有方法
- 有序性: 数据都是按照插入有序
- 重复性: 集合中元素都是可以重复的
- null值: 都可以存储 null值
- 安全性: 都是非线程安全的集合
不同点
- 底层数据结构: ArrayList底层是数组,LinkedList底层是链表(双向链表)
- 特有方法: LinkedList具有特有的方法,例如:addFirst、addLast…(因为多实现了一个Deque接口)
- 效率: ArrayList查询效率高O(1),LinkedList添加O(1)、删除效率高。
ArrayList添加元素趋近于O(1),在不扩容情况下就是O(1) - 应用场景: ArrayList在查询较高的业务场景优先考虑,LinkedList在修改、添加等操作较多的场景下优先考虑