【Java集合类】之 LinkedList(链表)

简介: 【Java集合类】之 LinkedList(链表)

Java集合框架🎏🎏🎏🎏🎏🎏🎏🎏🎏



Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等


今天我们详讲一下集合类 LinkedList(链表)


LinkedList 链表✨🎏🎊


1.1 链表的概述✨


概念:链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。

1.2 链表的分类✨


链表可分为单向链表和双向链表


一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。



一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接



1.3 ArrayList 与 LinkedList ✨


LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。


ArrayList用于


频繁访问列表中的某一个元素。

只需要在列表末尾进行添加和删除元素操作

LinkedList常用于


你需要通过循环迭代来访问列表中的某些元素。

需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。


1.4 LinkedList 实现类✨



LinkedList 继承了 AbstractSequentialList 类。

LinkedList 实现了 Queue 接口,可作为队列使用。

LinkedList 实现了 List 接口,可进行列表的相关操作。

LinkedList 实现了 Deque 接口,可作为队列使用。

LinkedList 实现了 Cloneable 接口,可实现克隆。

LinkedList 实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输。



List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。


此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。


所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。


注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问,如下所示:


List list = Collections.synchronizedList(new LinkedList(…));此类的 iterator 和 listIterator 方法返回的迭代器是快速失败 的:在迭代器创建之后,如果从结构上对列表进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。


注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何硬性保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。


1.5 LinkedList的构造方法✨


LinkedList

public LinkedList()

构造一个空列表。


LinkedList

public LinkedList(Collection c)

构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列。


参数:

c - 要将其元素放入此列表的 collection

抛出:

NullPointerException - 如果指定的 collection 为 null


1.6 LinkedList的常用方法摘要✨


方法

说明

boolean add(E e)

将指定元素添加到此列表的结尾。

void add(int index, E element)

在此列表中指定的位置插入指定的元素。

boolean addAll(Collection<? extends E> c)

添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序。

boolean addAll(int index, Collection<? extends E> c)

将指定 collection 中的所有元素从指定位置开始插入此列表。

void addFirst(E e)

将指定元素插入此列表的开头。

void addLast(E e)

将指定元素添加到此列表的结尾。

void clear()

从此列表中移除所有元素。

boolean contains(Object o)

如果此列表包含指定元素,则返回 true。

Iterator< E> descendingIterator()

返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。

E get(int index)

返回此列表中指定位置处的元素。

E getFirst()

返回此列表的第一个元素。

E getLast()

返回此列表的最后一个元素。

int indexOf(Object o)

返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。

int lastIndexOf(Object o)

返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。

ListIterator listIterator(int index)

返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。

E remove()

获取并移除此列表的头(第一个元素)。

E remove(int index)

移除此列表中指定位置处的元素。

boolean remove(Object o)

从此列表中移除首次出现的指定元素(如果存在)。

E removeFirst()

移除并返回此列表的第一个元素。

boolean removeFirstOccurrence(Object o)

从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)。

E removeLast()

移除并返回此列表的最后一个元素。

boolean removeLastOccurrence(Object o)

从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。

E set(int index, E element)

将此列表中指定位置的元素替换为指定的元素。

int size()

返回此列表的元素数。

Object[] toArray()

返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组。

toArray(T[] a)

返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组;返回数组的运行时类型为指定数组的类型。


1.7 代码示例:✨


package com.ithmm_01;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        //void add(int index, E element)  在此列表中指定的位置插入指定的元素。
        list.add(2,"王麻子"); //张三   李四  王麻子   王五
        // void addFirst(E e) |  将指定元素插入此列表的开头。
        // void addLast(E e) |  将指定元素添加到此列表的结尾。
        list.addFirst("王麻子");//王麻子 张三 李四 王五
        list.addLast("赵六");//张三 李四 王五 赵六
        //void clear() |从此列表中移除所有元素。
        list.clear();
        //descendingIterator()返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。
        Iterator<String> li = list.descendingIterator();
        while(li.hasNext()) {
            String s = li.next();
            System.out.print(s+" ");//王五 李四 张三
        }
        // E get(int index) |返回此列表中指定位置处的元素。
        System.out.println(list.get(2));//王五
//        E remove(int index) |移除此列表中指定位置处的元素。
        list.remove(0);//李四 王五
//        E set(int index, E element) |    将此列表中指定位置的元素替换为指定的元素。
//        int size() |返回此列表的元素数。
        list.set(0,"王麻子");//王麻子 李四 王五
        System.out.println(list.size());//3
// ListIterator<E> listIterator(int index) |返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。
        //获取列表迭代器,遍历集合
        ListIterator<String> li = list.listIterator();
        while(li.hasNext()) {
            String s = li.next();
            System.out.print(s+" ");
        }
    }
}


目录
相关文章
|
17天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
39 8
|
26天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
27 2
|
26天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
86 4
|
1月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
1月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
28 0
|
4月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
62 7
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
23 3
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
33 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
37 1