LinkedList源码解读

本文深入解析了LinkedList的数据结构原理,包括其内部类Node的设计、双向链表的维护方式及其核心API介绍。并通过一个消息队列的例子展示了LinkedList在多线程环境下的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    LinkedList里每一个元素都被包装成为了一个内部类,这个内部类维护着三个内存地址,所被存放对象的引用地址,上一个节点和下一个节点的引用地址。一个LinkedList对象第一个节点的上一个节点的内存地址为null,最后一个节点的下一个节点的内存地址为null。

 private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

    一个LinkeList对象只需要维护第一个节点的内存地址和最后一个节点的内存地址,就可以把所有所需要维护的实际对象而不被GC回收。除此之外,为了功能,LinkedList对象还维护着链表节点的数量。ps:   transient关键字,序列化的时候不要序列化被该修饰符修饰的变量。

 transient int size = 0;

    /**
     * Pointer to first node.
     * Invariant: (first == null && last == null) ||
     *            (first.prev == null && first.item != null)
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node<E> last;

 常用api,没什么好说的了,无非就是增删获取。对比ArrayList,LinkedList的插入和删除速度会比较快,因为LinkedLIst只需要改变上一个节点和下一个节点的引用就可以了,而ArrayList需要移动整个数组。而获取元素ArrayList的效率比LinkedList高。

public E getFirst()
public E getLast()
public E removeFirst()
public E removeLast()
public void addFirst(E e)
public void addLast(E e)
public boolean contains(Object o)
public int size()
public boolean add(E e)
public boolean addAll(Collection<? extends E> c)
public void clear()
public E remove(int index)

使用LinkedList实现消息队列

public class Exec {
    public static void main(String[] args) {
        // 生成同步列队
        SynchronizedQuery synQuery = new SynchronizedQuery();
        // 生成写入线程
        WriteThread writeThread = new WriteThread(synQuery);
        // 生成读取线程
        ReadThread readThread = new ReadThread(synQuery);
        // 启动两个线程
        readThread.start();
        writeThread.start();
    }
}
// 写入线程
class WriteThread extends Thread {
    // 同步队列类变量
    private SynchronizedQuery synQuery;
    // 该构造函数初始化同步队列类变量
    public WriteThread(SynchronizedQuery synQuery) {
        this.synQuery = synQuery;
    }
    // 线程运行主体
    public void run() {
        // 给同步队列添加字符串变量
        synQuery.addElement(new String("欢迎您!"));
    }
}

class ReadThread extends Thread {
    // 同步队列类变量
    private SynchronizedQuery synQuery;
    // 该构造函数初始化同步队列类变量
    public ReadThread(SynchronizedQuery synQuery) {
        this.synQuery = synQuery;
    }
    // 线程运行主体
    public void run() {
        // 读取同步队列中的字符串变量
        System.out.println((String) synQuery.popElement());
    }
}

class SynchronizedQuery {
    // 存储元素的LinkedList
    private LinkedList linkedList = new LinkedList();
    // 添加元素的同步方法
    public synchronized void addElement(Object obj) {
        linkedList.addFirst(obj);
        // 通知其他线程已有元素加入队列
        notify();
    }
    // 取出元素的同步方法
    public synchronized Object popElement() {
        // 如果队列为空,则挂起当前线程,等待其他线程添加元素
        while (linkedList.isEmpty()) {
            try {
                wait();
            } catch (InterruptedException ex) {
            }
        }
        return linkedList.removeLast();
    }
}

内容概要:本文深入探讨了利用MATLAB/Simulink搭建变压器励磁涌流仿真模型的方法和技术。首先介绍了空载合闸励磁涌流仿真模型的搭建步骤,包括选择和配置电源模块、变压器模块以及设置相关参数。文中详细讲解了如何通过代码生成交流电压信号和设置变压器的变比,同时强调了铁芯饱和特性和合闸角控制的重要性。此外,还讨论了电源简化模型的应用及其优势,如使用受控电压源替代复杂电源模块。为了更好地理解和分析仿真结果,文章提供了绘制励磁涌流曲线的具体方法,并展示了如何提取和分析涌流特征量,如谐波含量和谐波畸变率。最后,文章指出通过调整电源和变压器参数,可以实现针对不同应用场景的定制化仿真,从而为实际工程应用提供理论支持和技术指导。 适合人群:从事电力系统研究、变压器设计及相关领域的科研人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解变压器励磁涌流特性的研究人员,旨在帮助他们掌握MATLAB/Simulink仿真工具的使用技巧,提高对励磁涌流现象的理解和预测能力,进而优化继电保护系统的设计。 其他说明:文中不仅提供了详细的建模步骤和代码示例,还分享了一些实用的经验和技巧,如考虑磁滞效应对涌流的影响、避免理想断路器带来的误差等。这些内容有助于读者在实践中获得更加准确可靠的仿真结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值