LinkedList子类 | 带你学《Java语言高级特性》之一百零二

简介: 学习LinkedList子类的操作方法的使用,掌握ArrayList与LinkedList的区别。

上一篇:ArrayList子类 | 带你学《Java语言高级特性》之一百零一
【本节目标】
学习LinkedList子类的操作方法的使用,掌握ArrayList与LinkedList的区别。

LinkedList子类

在List接口中还有一个比较常用的子类:LinkedList,这个类通过名称就可以发现其特点:基于链表的实现。那么首先观察一下LinkedList的定义:

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable

image.pngLinkedList类的继承关系

范例:使用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的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:Vector子类 | 带你学《Java语言高级特性》之一百零三
更多Java面向对象编程文章查看此处

相关文章
|
4天前
|
Java 数据挖掘 开发者
Java网络编程进阶:Socket通信的高级特性与应用
【6月更文挑战第21天】Java Socket通信是分布式应用的基础,涉及高级特性如多路复用(Selector)和零拷贝,提升效率与响应速度。结合NIO和AIO,适用于高并发场景如游戏服务器和实时数据分析。示例展示了基于NIO的多路复用服务器实现。随着技术发展,WebSockets、HTTP/2、QUIC等新协议正变革网络通信,掌握Socket高级特性为应对未来挑战准备。
|
8天前
|
Java 开发者
揭秘!LinkedList是如何华丽变身成为Java队列之王的?
【6月更文挑战第18天】Java的`LinkedList`既是列表也是队列之星,实现`Queue`接口,支持FIFO操作。其内部的双向链表结构确保了添加/移除元素的高效性(O(1)),适合作为队列使用。它线程不安全,但可通过同步包装用于多线程环境。此外,`LinkedList`还能灵活变身栈或双端队列,提供多种数据结构功能。
|
2天前
|
算法 Java
垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
13 3
|
8天前
|
存储 安全 Java
Java Queue实战:LinkedList是如何帮我轻松解决排队问题的?
【6月更文挑战第18天】在Java编程中,`LinkedList`常用于解决排队问题,如在多线程应用处理任务队列。`TaskQueue`类展示了如何使用`LinkedList`作为线程安全的`Queue&lt;Runnable&gt;`:添加任务到队列(`addTask`)和执行并移除队列首任务(`executeTask`)均通过同步方法保证并发安全性。这样确保了任务按顺序执行,提升了程序效率和稳定性。
|
8天前
|
Java 开发者
Queue大比拼:为何LinkedList能在众多Java集合中脱颖而出?
【6月更文挑战第18天】**Java的LinkedList作为队列的优势在于其双向链表实现,支持O(1)时间复杂度的首尾操作,适合作为Queue接口的实现。它也是线程不安全的,但在单线程环境下性能优越,并可通过Collections同步化。此外,它的灵活性使其也能胜任栈和双端队列的角色。**
|
8天前
|
安全 Java
Java Queue新玩法:用LinkedList打造高效队列,让你的代码飞起来!
【6月更文挑战第18天】Java集合框架中的`LinkedList`不仅是列表,还可作为高效队列。由于其在链表两端进行添加/移除操作的时间复杂度为O(1),故适合实现并发环境下的任务队列。通过案例展示了如何创建、添加任务及确保线程安全,揭示了`LinkedList`提升代码性能的秘密,特别是在多线程应用中的价值。
|
8天前
|
安全 Java 调度
Java Queue深度解析:LinkedList为何成为队列的最佳实践?
【6月更文挑战第18天】Java的`LinkedList`适合作为队列,因其双向链表结构支持O(1)的头尾操作。非线程安全的`LinkedList`在单线程环境下效率高,多线程时可通过`Collections.synchronizedList`封装。此外,它还可兼做栈和双端队列,提供任务调度的高效解决方案。
|
8天前
|
存储 安全 Java
告别低效!Java Queue与LinkedList的完美结合,让你的程序更高效!
【6月更文挑战第18天】Java的`LinkedList`作为`Queue`实现,提供高效并发队列。利用双向链表,它在头部和尾部操作有O(1)复杂度,适合大量数据和高并发。通过`Collections.synchronizedList`可使其线程安全,用于任务调度等场景,展现灵活性和高性能。
|
8天前
|
安全 Java 开发者
队列之道:为何LinkedList在Java中成为队列的首选?
【6月更文挑战第18天】Java集合框架中的`LinkedList`常用于实现队列,因其简单实现、高效FIFO操作(O(1)的添加与移除)、实现`Queue`接口、线程不安全(提升单线程性能)及灵活性(可兼作栈或双端队列)。代码示例展示了其作为队列的基本用法,`peek`查看头部元素,`remove`进行出队操作。在需要线程安全时,可使用`Collections.synchronizedList`进行包装。
|
7天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【6月更文挑战第18天】在Java中,Map的两大代表HashMap和TreeMap提供高效键值对操作。HashMap允许设定初始容量和加载因子以优化性能,非线程安全,可借助synchronized或ConcurrentHashMap处理多线程。遍历可通过entrySet()、keySet()和values()。而TreeMap依据键进行排序,支持自然排序和自定义Comparator,提供范围查询、获取首尾键的功能,适用于需有序遍历的场景。理解和利用这些特性能增强代码功能和效率。