LinkList以双向链路表实现,链表无容量限制,但双向链表本身使用了跟多空间,每插入一个元素都要构造一个额外的Node对象,也需要额外的链表指针操作。
为了解决 ArrayList 增删元素时效率低下的局限性,可以使用 List 接口的另一个实现类 LinkedList。该集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个和后一个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时,只需要修元素之间的这种引用关系即可,删除一个节点也是如此。正因为这样的存储结构,LinkedList 集合对于元素的增删操作具有很高的效率,LinkedList 集合添加元素和删除元素的过程如下所示。
上图中,通过两张图描述了 LinkedList 集合新增元素和删除元素的过程。其中,左图为新增一个元素,图中的元素 1 和元素 2 在集合中彼此为前后关系,在它们之间新增一个元素时,只需要让元素 1 记住它后面的元素是新元素,让元素 2 记住它前面的元素为新元素就可以了。右图为删除元素,要想删除元素 1 与元素 2 之间的元素 3,只需要让元素 1 与元素 2 变成前后关系就可以了。由此可见,LinkedList 集合具有增删元素效率高的特点。
- 优点
不需要扩容和预留空间,对元素的增删操作效率高。
- 缺点
允许元素为null,线程不安全。
import java.util.LinkedList;
public class example02 {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList(); //创建LinkList集合
linkedList.add("stu1");//创建元素
linkedList.add("stu2");
linkedList.add("stu3");
linkedList.add("stu4");
System.out.println(linkedList);//查看集合元素
linkedList.add(2, "stu8");//在集合2位置上添加"stu8"元素
linkedList.addFirst("stu0"); //在集合末位置添加元素
System.out.println(linkedList);//输出元素
System.out.println("获取集合中第一个元素:" + linkedList.getFirst());//调用get()方法,获取集合中第一个元素
linkedList.remove(3);//删除集合中第三个元素
linkedList.removeFirst();//删除集合首位元素
System.out.println(linkedList);//输出集合元素
}
}
console:
[stu1, stu2, stu3, stu4]
[stu0, stu1, stu2, stu8, stu3, stu4]
获取集合中第一个元素:stu0
[stu1, stu2, stu3, stu4]