- inkedList底层是双向链表,一个节点挂着一个节点
- LinkedList不需要设定长度,不需要扩容
LinkedList 的优缺点
- 优点
① 往里面插入一些元素的时候不需要像ArrayList数组那样需要挪动大量的元素了,直接在链表里加入一个节点就可以了
② 如果要不断的往LinkedList中插入一些元素,大量的插入,就不需要像ArrayList那样还要去扩容了,人家就是一个链表,就是不断的把新的节点挂到链表上就可以了 - 缺点
① 不适合用于随机查找。比如LinkedList.get(10)这种操作,性能很低,因为需要遍历这个链表,从头开始遍历这个链表,直到找到index=10的这个元素为止;而ArrayList.get(10),不需要遍历,直接根据内存的地址,根据你指定的index,直接定位到那个元素
使用场景
- ArrayList:一般场景,都是用ArrayList来代表一个集合,只要别频繁的往里面插入和灌入大量的元素就可以了,主要用于查找
- LinkedList:适合频繁的在list中插入和删除某个元素,然后LinkedList还额外实现了Deque接口,可以当做队列来使用
插入相关的方法
- add():默认就是在队列的尾部插入一个元素
- add(index,element):是在队列的中间也就是index位置插入一个元素
- addFirst():在队列的头部插入一个元素
- addLast():在队列的尾部插入一个元素,与add()调用的是同一个方法linkLast(E e)
获取相关的方法
- getFirst()、peek():获取头部元素,其实就是直接返回 first 指针指向的那个 Node 里面的数据,都是返回头部的元素。getFirst()如果是对空 list 调用,会抛出异常;peek()对空 list 调用,会返回 null
- getLast():获取尾部元素的元素
- get():随机获取某个位置(index位置)的值,如果要获取某个随机位置的元素,需要使用 node(index)这个方法,是要进行链表的遍历,会判断一下index和 size>>1 进行比较,如果在前半部分,就会从头部开始遍历;如果是在后半部分,就会从尾部开始遍历
Node<E> node(int index) {
// assert isElementIndex(index);
// index < (size >> 1) 即 index < size/2
// 代表在链表的前半部分
// 会从头开始遍历
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
// index >= size/2
// 代表在链表的后半部分
// 会从尾部开始遍历
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
删除相关的方法
- removeLast():移除最后一个元素
- removeFirst()、poll():移除第一个元素
- remove(int index):移除随机位置的值
可以当做队列来使用
offer()往队尾插入元素,poll()从队头删除元素