Java中LinkList的基本介绍和细节讨论。双向链表的代码和LinkList的源码。LinkList和ArrayList的比较与选择。

这篇具有很好参考价值的文章主要介绍了Java中LinkList的基本介绍和细节讨论。双向链表的代码和LinkList的源码。LinkList和ArrayList的比较与选择。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LinkedList 是 Java 中的一个双向链表实现的类,它实现了 List 接口,同时也实现了 Deque 接口,因此可以用作列表、队列或双端队列。下面是关于 LinkedList 的基本介绍和细节讨论:

基本介绍:

  • LinkedList 是一个双向链表实现,每个节点包含了当前元素的值、指向前一个节点的引用和指向下一个节点的引用。

  • 它实现了 List 接口,因此具备了列表的功能,支持随机访问、添加、删除等操作。

  • 由于是链表实现,它在插入和删除元素时的性能通常比数组实现的 ArrayList 更好。

  • 它同时也实现了 Deque 接口,因此支持队列和双端队列的操作。

细节讨论:

  • LinkedList 允许元素为 null

  • 由于是链表结构,它在随机访问时的性能较差,需要遍历链表来找到对应索引的元素。

  • 插入和删除元素的性能较好,因为只需要改变节点的引用即可,而不需要像数组那样进行元素的移动。

  • LinkedList 内部使用双向链表结构,因此在插入和删除元素时不需要像 ArrayList 那样进行数组元素的移动。

  • LinkedList 不适合大量随机访问的场景,适合在插入和删除元素频繁的情况下使用。

  • LinkedList 在使用迭代器遍历时,性能可能会比 ArrayList 稍差,因为它需要在链表中移动节点。

  • LinkedList 的内存消耗会稍微大于 ArrayList,因为每个节点需要保存额外的前后节点的引用。

适用场景:

  • 当需要频繁地在列表的任意位置插入或删除元素时,可以考虑使用 LinkedList

  • 当需要实现队列或双端队列时,LinkedList 是一个不错的选择,因为它实现了 Deque 接口。

  • 不适合需要频繁随机访问元素的场景,因为它的随机访问性能较差。

总之,LinkedList 是一种适合特定场景的数据结构,特别适用于需要频繁插入和删除元素的情况。在选择使用时,应根据具体的应用场景和性能需求进行权衡。

双向列表的代码:

public class LinkListExpandCode {
    public static void main(String[] args) {
        Node ret1 = new Node("ret1");
        Node ret2 = new Node("ret2");
        Node ret3 = new Node("ret3");

        ret1.next = ret2;
        ret2.next = ret3;
        ret3.pre = ret2;
        ret2.pre = ret1;

        Node first = ret1;
        Node last = ret3;

        //从头遍历
        while (true){
            if(first == null){
                break;
            }
            System.out.println(first);
            first = first.next;
        }

        //从尾遍历
        while (true){
            if(last == null){
                break;
            }
            System.out.println(last);
            last = last.pre;
        }

        //插入对象
        Node ret = new Node("ret");
        ret.next = ret3;
        ret.pre = ret2;
        ret2.next = ret;
        ret3.pre = ret;

        //遍历
        //遍历之前先将first恢复原位,因为之前从头开始遍历的时候first到尾部了
        first = ret1;//first恢复原位
        //从头遍历
        while (true){
            if(first == null){
                break;
            }
            System.out.println(first);
            first = first.next;
        }

        //删除对象
        ret2.next = ret3;
        ret3.pre = ret2;
        //从头遍历
        first = ret1;//first恢复原位
        while (true){
            if(first == null){
                break;
            }
            System.out.println(first);
            first = first.next;
        }


    }
}

class Node{

    //模拟双向列表
    private Object name;
    public Node pre;//注意这里的类型是Node类型,因为在main方法中pre和next要作为引用指向别的结点
    public Node next;

    public Node(Object name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Node{" +
                "name=" + name +
                '}';
    }
}

LinkList的源码:

public class LinkListCRUD {
    public static void main(String[] args) {
        /*
        *
        * 源码(以增为例):
          第一步
            public LinkedList() {
            }
          第二步
            public boolean add(E e) {
                linkLast(e);
                return true;
            }
          第三步
            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++;
            }
           //Node类
           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;
                }
           }
        *
        * */
        LinkedList linkedList = new LinkedList();
        //增
        linkedList.add("ret1");
        linkedList.add("ret2");
        linkedList.add("ret3");
        System.out.println(linkedList);
        //删
        linkedList.remove("ret2");
        System.out.println(linkedList);
        //改
        linkedList.set(1,"ret2");
        System.out.println(linkedList);
        //查
        System.out.println(linkedList.contains("ret2"));
        System.out.println(linkedList.get(1));


    }
}

Java中LinkList和ArrayList的比较与选择:

LinkedListArrayList 都是 Java 中常用的集合类,它们分别基于链表和动态数组的数据结构实现,各有优劣。下面是它们的比较与选择的一些方面:

性能比较:

  • 随机访问:ArrayList 在随机访问时性能优于 LinkedList,因为 ArrayList 底层使用数组,可以通过索引直接访问元素,而 LinkedList 需要遍历链表才能访问指定索引的元素。

  • 插入和删除:LinkedList 在插入和删除元素时性能优于 ArrayList,因为链表插入和删除只需要改变节点的引用,而不需要移动元素。而 ArrayList 在插入和删除时需要移动元素来保持连续性。

内存消耗:

  • LinkedList 需要额外的空间存储前后节点的引用,因此内存消耗稍高于 ArrayList

  • ArrayList 需要预分配数组空间,当元素个数增加时可能需要进行扩容,扩容时需要重新分配数组并复制元素,可能会导致内存重新分配的开销。

迭代性能:

  • 在使用迭代器遍历集合时,ArrayList 的性能通常优于 LinkedList,因为 ArrayList 在数组中连续存储元素,迭代时可以更高效地访问。

适用场景:

  • 如果需要频繁进行随机访问操作,使用 ArrayList 更合适,例如需要根据索引获取元素或进行快速遍历。

  • 如果需要频繁进行插入和删除操作,特别是在中间位置进行插入和删除,使用 LinkedList 更合适,因为链表插入和删除操作性能更好。

综合考虑:

  • 如果对集合的操作类型不确定,或者需要在不同操作间取得平衡,可以根据实际场景进行选择。

  • 如果对性能要求不高,且操作类型多样,可以优先选择 ArrayList,因为它在大多数情况下都表现得很好。

  • 如果需要根据不同操作类型进行优化,也可以根据操作的频率和性质来选择使用 ArrayListLinkedList

综合来说,选择使用 ArrayList 还是 LinkedList 取决于具体的使用场景和操作类型。如果可能,可以根据实际需求进行性能测试和评估,以便选择最适合的集合类。文章来源地址https://www.toymoban.com/news/detail-674012.html

到了这里,关于Java中LinkList的基本介绍和细节讨论。双向链表的代码和LinkList的源码。LinkList和ArrayList的比较与选择。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 双向链表的实现

      在本次的博客当中我们来向大家介绍一下双向循环链表,在介绍双向循环链表之前我们需要先来了解一下所有的链表的种类。   我们的链表大致分为八种:单向链表,双向链表,带头结点的链表,不带头结点的链表,循环链表,不循环的链表。经过组合一共分为八种。(单

    2024年02月01日
    浏览(34)
  • 【双向链表的实现】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 双向链表的结构 2. 双向链表的实现 2.1 头文件 ——双向链表的创建及功能函数的定义 2.2 源文件 ——双向链表的功能函数的实现 2.3 源文件 ——双向链表功能的测试 4.双向链表的操作示意图

    2024年02月05日
    浏览(36)
  • 双向链表的功能实现

          前言:我们已经学习并知道了单链表的实现,链表的实现方式不只是单链表一种,今天我们就来介绍一种新的结构,就是双链表结构,本质上是将节点间进行双向链接,从而使一些操作更加容易实现。 目录 1.双向链表的简介 2.双向链表的实现 带头节点的哨兵位的创建

    2024年02月05日
    浏览(52)
  • 【数据结构】链表的分类和双向链表

    本篇是基于上篇单链表所作,推荐与上篇配合阅读,效果更加 http://t.csdnimg.cn/UhXEj 链表的结构非常多样,以下情况组合起来就有8种(2 x 2 x 2)链表结构: 我们一般叫这个头为哨兵位 我们上回讲的单链表就是不带头单项不循环链表。 今天我们要讲带头双向循环的链表。 不过

    2024年01月25日
    浏览(38)
  • 【数据结构】双向链表的实现

    我要扼住命运的咽喉,他却不能使我完全屈服。                      --贝多芬 目录 一.带头循环的双向链表的特点 二.不带头不循环单向链表和带头循环的双向链表的对比 三.初始化链表,创建哨兵结点 四.双向链表的各种功能的实现 1.双向链表的尾插 2.双向链表的打印 

    2023年04月10日
    浏览(44)
  • 数据结构——双向链表的实现

    注意: 双向链表又称带头双向循环链表 这⾥的“带头”跟前⾯我们说的“头节点”是两个概念,实际前⾯的在单链表阶段称呼不严 谨,但是为了同学们更好的理解就直接称为单链表的头节点。 带头链表⾥的头节点,实际为“ 哨兵位 ”,哨兵位节点不存储任何有效元素,只

    2024年02月06日
    浏览(46)
  • 双向链表的接口的接口程序

    2024年04月24日
    浏览(31)
  • 链表的极致——带头双向循环链表

    ​ 双向带头循环链表是链表结构最复杂,但使用最方便的链表。 [图中phead表示链表的头节点(哨兵); d1,d2等表示链表存储的数据; d1,d2等左侧的方框存储是指向该节点的上一个节点的指针(prev),右侧方框存储指向该节点的下一个的指针(next)] 双向带头循环链表的每

    2024年04月10日
    浏览(76)
  • 【(数据结构)— 双向链表的实现】

    注意: 这里的 “带头” 跟前面我们说的 “头节点” 是两个概念,实际前面的在单链表阶段称呼不严 谨,但是为了同学们更好的理解就直接称为单链表的头节点。 带头链表里的头节点,实际为 “哨兵位” ,哨兵位节点不存储任何有效元素,只是站在这里“放哨 的” “哨

    2024年02月06日
    浏览(44)
  • C语言双向链表的增删操作

    2024年04月24日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包