上一篇:ArrayList子类 | 带你学《Java语言高级特性》之一百零一
【本节目标】
学习LinkedList子类的操作方法的使用,掌握ArrayList与LinkedList的区别。
LinkedList子类
在List接口中还有一个比较常用的子类:LinkedList,这个类通过名称就可以发现其特点:基于链表的实现。那么首先观察一下LinkedList的定义:
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable
LinkedList类的继承关系
范例:使用LinkedList实现集合操作
import java.util.LinkedList;
import java.util.List;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
List<String> all = new LinkedList<String>();
all.add("Hello");
all.add("Hello");
all.add("Wolrd");
all.add("MLDN");
all.forEach(System.out::println); //Hello Hello World MLDN
}
}
如果现在只是观察程序的功能会发现和ArrayList使用是完全一样的,但是其内部实现机制是完全不同的,首先观察LinkedList构造方法里面并没有提供像ArrayList那样的初始化大小的方法,而只是提供了无参构造处理:“public LinkedList()”。随后观察add()方法的具体实现。
public boolean add(E e) {
linkLast(e);
return true;
}
在之前编写自定义链表时,是判断了传入数据是否为null,如果为null则不进行保存,但在LinkedList中并没有做这样的处理,而是所有的数据都可以保存,而后此方法调用了linkLast()方法(在最后一个节点后追加)。
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++;
}
在LinkedList类中保存的数据都是利用Node节点进行的封装处理,同时为了提高程序执行性能,每一次都会保存上一个追加的节点(最后一个节点),就可以在增加数据的时候避免递归处理,在增加数据时要进行数据保存个数的追加。
通过上面的分析,可以发现LinkedList封装的就是一个链表实现。
面试题:
请问ArrayList与LinkedList有什么区别?
- ArrayList是数组实现的集合操作,而LinkedList是链表实现的集合操作;
- 在使用List集合中的get()方法根据索引获取数据时,ArrayList的时间复杂度为“O(1)”、而LinkedList时间复杂度为“O(n)”(n为集合的长度);
- ArrayList在使用时默认的初始化对象数组的大小长度为10,如果空间不足则会采用2倍形式进行容量的扩充,如果保存大数据量的时候有可能会造成垃圾的产生以及性能的下降,但是这时候可以使用LinkedList类保存。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学