java-linkedlist 源码分析 2

### 5. 迭代器支持

`LinkedList` 实

现了 `Iterable` 接口,提供了支持迭代的功能:

```java
public Iterator<E> iterator() {
    return new ListItr(0);
}

public ListIterator<E> listIterator(int index) {
    checkPositionIndex(index);
    return new ListItr(index);
}

private class ListItr implements ListIterator<E> {
    private Node<E> lastReturned;
    private Node<E> next;
    private int nextIndex;
    private int expectedModCount = modCount;

    ListItr(int index) {
        next = (index == size) ? null : node(index);
        nextIndex = index;
    }

    public boolean hasNext() {
        return nextIndex < size;
    }

    public E next() {
        checkForComodification();
        if (!hasNext())
            throw new NoSuchElementException();

        lastReturned = next;
        next = next.next;
        nextIndex++;
        return lastReturned.item;
    }

    public boolean hasPrevious() {
        return nextIndex > 0;
    }

    public E previous() {
        checkForComodification();
        if (!hasPrevious())
            throw new NoSuchElementException();

        lastReturned = next = (next == null) ? last : next.prev;
        nextIndex--;
        return lastReturned.item;
    }

    public void remove() {
        checkForComodification();
        if (lastReturned == null)
            throw new IllegalStateException();

        Node<E> lastNext = lastReturned.next;
        unlink(lastReturned);
        if (next == lastReturned)
            next = lastNext;
        else
            nextIndex--;
        lastReturned = null;
        expectedModCount++;
    }

    public void set(E e) {
        if (lastReturned == null)
            throw new IllegalStateException();
        checkForComodification();
        lastReturned.item = e;
    }

    public void add(E e) {
        checkForComodification();
        lastReturned = null;
        if (next == null)
            linkLast(e);
        else
            linkBefore(e, next);
        nextIndex++;
        expectedModCount++;
    }

    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
}
```

### 6. 序列化与克隆

#### 6.1 序列化

`LinkedList` 实现了 `Serializable` 接口,允许其对象被序列化。序列化和反序列化通过 `writeObject` 和 `readObject` 方法自定义处理。

```java
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {
    // Write out any hidden serialization magic
    s.defaultWriteObject();

    // Write out size
    s.writeInt(size);

    // Write out all elements in the proper order.
    for (Node<E> x = first; x != null; x = x.next)
        s.writeObject(x.item);
}

private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
    // Read in any hidden serialization magic
    s.defaultReadObject();

    // Read in size
    int size = s.readInt();

    // Read in all elements in the proper order.
    for (int i = 0; i < size; i++)
        linkLast((E) s.readObject());
}
```

- `writeObject`:序列化 `LinkedList` 对象,包括元素数量和所有元素。
- `readObject`:反序列化 `LinkedList` 对象,根据序列化的数据恢复链表结构。

#### 6.2 克隆

`LinkedList` 实现了 `Cloneable` 接口,提供了 `clone` 方法用于深度克隆。

```java
public Object clone() {
    LinkedList<E> clone = super.clone();

    // Put clone into "virgin" state
    clone.first = clone.last = null;
    clone.size = 0;
    clone.modCount = 0;

    // Initialize clone with our elements
    for (Node<E> x = first; x != null; x = x.next)
        clone.add(x.item);

    return clone;
}
```

- `clone` 方法通过 `super.clone` 创建一个新的 `LinkedList` 实例,并逐个复制元素到新实例中。

### 7. 性能分析

#### 7.1 时间复杂度

- **添加元素**:在头部或尾部添加元素的时间复杂度为 O(1)。
- **删除元素**:在头部或尾部删除元素的时间复杂度为 O(1)。
- **随机访问**:随机访问元素的时间复杂度为 O(n)。
- **插入和删除操作**:在链表中间插入和删除元素的时间复杂度为 O(n),因为需要遍历链表找到指定位置。

#### 7.2 空间复杂度

`LinkedList` 使用链表节点来存储元素,每个节点包含元素数据和前后节点的引用。因此,`LinkedList` 的空间复杂度主要取决于元素数量和节点的开销。

### 8. `LinkedList` 的缺点和使用场景

#### 8.1 缺点

- **随机访问效率低**:由于链表不支持通过索引快速访问元素,随机访问元素的时间复杂度为 O(n)。
- **额外内存开销**:每个节点需要存储前后节点的引用,因此链表的内存开销较高。

#### 8.2 使用场景

- **插入和删除操作频繁**:在需要频繁进行插入和删除操作的场景中,`LinkedList` 的性能优于 `ArrayList`。
- **元素数量动态变化**:当元素数量经常变化且需要在中间插入和删除时,`LinkedList` 是一个不错的选择。

### 9. `LinkedList` 的替代方案

在特定场景下,其他集合类可能比 `LinkedList` 更合适。例如:

- **`ArrayList`**:`ArrayList` 适用于需要频繁进行随机访问和遍历的场景,其插入和删除操作性能较低。
- **`Deque`**:双端队列(`Deque`)提供了类似 `LinkedList` 的功能,并且有多种实现,如 `ArrayDeque` 和 `LinkedList`。
- **`Stack`**:如果主要使用 `LinkedList` 的栈功能,可以考虑使用 `Stack` 类,但需要注意 `Stack` 是同步的,性能相对较低。

### 10. 总结

`LinkedList` 是 Java 集合框架中的一个重要类,提供了基于双向链表的集合实现。通过详细分析 `LinkedList` 的源码,可以更好地理解其内部机制和工作原理。`LinkedList` 适用于频繁进行插入和删除操作的场景,但在随机访问和遍历操作上性能较低。

通过深入了解 `LinkedList` 的数据结构、构造方法、核心操作、迭代器支持、序列化与克隆等,可以更有效地使用 `LinkedList` 并优化程序性能。同时,了解其局限性和替代方案,有助于在不同应用场景中选择最合适的集合类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue计算属性 computed

计算属性 computed 模板语法的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑。 模板语法&#xff1a;模板语法链接 <template…

表单自定义组件 - 可选择卡片SelectCard

import React from react; import styles from ./index.module.less;type OptionsType {/*** 每个item渲染一行&#xff0c;第0项为标题*/labels?: any[];/*** 自定义渲染内容*/label?: string | React.ReactNode;value: any; }; interface IProps {value?: any;onChange?…

【C++】B树及其实现

写目录 一、B树的基本概念1.引入2.B树的概念 二、B树的实现1.B树的定义2.B树的查找3.B树的插入操作4.B树的删除5.B树的遍历6.B树的高度7.整体代码 三、B树和B*树1.B树2.B*树3.总结 一、B树的基本概念 1.引入 我们已经学习过二叉排序树、AVL树和红黑树三种树形查找结构&#x…

vue事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template> <buttonclick"addCount">点击</button><p>count is: {{ count }}</p><p>{{ coutent_e }}</p> </template> <script>expor…

关于HTTP的攻击实验

实验原理&#xff1a;1. 根据ARP中间人攻击&#xff0c;获取 用户和服务器之间的数据2. 将获取到的数据 通过一定的技术来复原&#xff0c;进而获取用户的信息或者 相关权限实验拓扑图 将 kali 的网卡改为桥接模式&#xff0c;查看Kali和本机的ip 启动ettercap&#xff0c;…

【Python学习】流程控制、函数与类详解

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 Python作为一门强大而又简洁的编程语言&#xff0c;提供了丰富的工具和结构来帮助开发者编写清晰、高效的代码。在本文中…

uniapp video视频铺满容器,不显示控件

1、video标签的属性 参考video | uni-app官网 enable-progress-gesture&#xff1a;是否开启控制进度的手势&#xff0c;bool值 show-center-play-btn&#xff1a;是否显示视频中间的播放按钮&#xff0c;bool值 object-fit&#xff1a;当视频大小与 video 容器大小不一致时&…

阿里云OSS文件上传不配置环境变量使用显式AccessKey验证

问题背景 在中阿里云官方文档中介绍文件上传时&#xff0c;推荐配置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。这里用简单的方法&#xff0c;直接在Demo.java中显式指定accessKeyId和accessKeySecret&#xff0c;同时修改OSSClientBuilder()的入参。 解决方法 首先…

C语言 -- 深入理解指针(一)

C语言 -- 深入理解指针&#xff08;一&#xff09; 1.内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;​2.2 指针变量和解引用操作符&#xff08;*&#xff09;​​2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引…

C++11 shared_ptr---面试常考

shared_ptr简介 共享对其所指堆内存空间的所有权&#xff0c;当最后⼀个指涉到该对象的shared_ptr不再指向他时&#xff0c;shared_ptr会⾃动析构所指对象如何判断⾃⼰是否指涉到该资源的最后⼀个&#xff1f;《引⽤计数》 shared_ptr构造函数&#xff0c;使引⽤计数析构函数&…

Java线上接口耗时分析神器 Arthas

介绍 程序员的日常&#xff0c;总是离不开“调优”和“排查”。尤其当线上环境出现问题&#xff0c;性能瓶颈把人逼疯。这时候&#xff0c;你就需要一款像 Arthas 这样的神器来救场。 什么是 Arthas&#xff1f; 简单来说&#xff0c;Arthas 是阿里巴巴开源的 Java 诊断工具…

String类对象比较:==和equals的具体细节

public class test {public static void main(String[] args) {String name1 "zzz";String name2 "zzz";String name3 new String("zzz");// hashCode() 方法&#xff1a;基于字符串的内容计算哈希值&#xff0c;因此内容相同的字符串对象其 …

在 PostgreSQL 中,如何处理多个长时间运行的查询对系统资源的竞争?

文章目录 一、问题分析二、解决方案&#xff08;一&#xff09;优化查询语句&#xff08;二&#xff09;限制资源使用&#xff08;三&#xff09;调整数据库参数&#xff08;四&#xff09;监控和分析查询性能&#xff08;五&#xff09;分区表&#xff08;六&#xff09;异步处…

MySQL SQL100道基础练习题

1、客户端连接 mysql -uroot -h172.17.0.1 -P3306 -p123456 2、SQL分类 DDL&#xff0c;数据定义语言&#xff0c;用于创库表等。 DML&#xff0c;数据操作语言&#xff0c;用于增删改等。 DQL&#xff0c;数据查询语言&#xff0c;用于数据查询等。 DCL&#xff0c;数据控制语…

ensp和hcl共存

Windows 安装ensp 华为 和 HCL 华三 模拟器教程_华为_晨熙哟-开放原子开发者工作坊 (csdn.net) 1、HCL_v5.8.0-Setup&#xff08;华三模拟器&#xff09; 2、WinPcap_4_1_3 3、Wireshark-win64-3.0.6 4、VirtualBox-5.2.26-128414-Win/ 5、eNSP V100R003C00SPC100 Setup&a…

Ratf协议图解、Nacos CP集群源码分析

文章目录 Nacos CP集群说明Raft协议leader选举重新选举leader多个Candidate情况更新操作&#xff0c;日志复制网络分区 源码实现服务注册leader选举leader心跳包 Nacos CP集群 说明 CAP原则 C 一致性 ConsistencyA 可用性 Availability分区容错性 Partition tolerance 分区…

【密码学】密码学五要素

密码学五要素是密码系统的基本组成部分&#xff0c;这五个要素共同构成了密码系统的框架。在实际应用中&#xff0c;密码系统的安全性依赖于密钥的安全管理以及算法的强度。 如果任何一方被泄露或破解&#xff0c;那么整个密码系统都将面临风险。因此&#xff0c;在设计和使用密…

生物化学笔记:电阻抗基础+电化学阻抗谱EIS+电化学系统频率响应分析

视频教程地址 引言 方法介绍 稳定&#xff1a;撤去扰动会到原始状态&#xff0c;反之不稳定&#xff0c;还有近似稳定的 阻抗谱图形&#xff08;Nyquist和Bode图&#xff09; 阻抗谱图形是用于分析电化学系统和材料的工具&#xff0c;主要有两种类型&#xff1a;Nyquist图和B…

《第一行代码》小结

文章目录 一. Android总览1. 系统架构2. 开发环境3. 在红米手机上运行4. 项目资源详解4.1 整体结构4.2 res文件4.3 build.gradle文件 二. Activity0. 常用方法小结1. 创建一个Activity 一. Android总览 1. 系统架构 应用层&#xff1a;所有安装在手机上的应用程序 应用框架层&…