Java LinkedList实现详解

一、什么是LinkedList

LinkedList是Java中的一个双向链表类。它继承了AbstractSequentialList并且实现了List、Deque、Cloneable和Serializable接口。

相对于Arraylist来说,LinkedList的插入和删除操作更加高效。正因为它是一个链表,所以它的内存布局不是连续的,这就为它提供了灵活性和可调整性。

java LinkedList类有以下构造器:

    public LinkedList ()
    public LinkedList (Collection  c)

二、LinkedList的常用API

1、boolean add(E e)

在LinkedList的结尾添加元素,返回值为true。

    LinkedList<String> list = new LinkedList<>();
    list.add("Java");
    list.add("Go");
    list.add("Python");

2、void add(int index, E element)

将元素插入LinkedList指定的位置。

    LinkedList<String> list = new LinkedList<>();
    list.add("Java");
    list.add("Go");
    list.add("Python");
    list.add(1,"C++");

3、boolean addAll(Collection c)

将传入的集合中的所有元素添加到LinkedList的结尾。如果添加成功,则返回true。

    List<String> list1 = new LinkedList<>();
    list1.add("Java");
    list1.add("Go");
    list1.add("Python");

    List<String> list2 = new LinkedList<>();
    list2.add("C++");
    list2.add(".Net");
    list2.add("JavaScript");

    list1.addAll(list2);

4、void addFirst(E e)

将指定元素添加到LinkedList的开头。

    LinkedList<String> list = new LinkedList<>();
    list.add("Java");
    list.add("Go");
    list.add("Python");
    list.addFirst("C++"); //在list的开头添加元素"C++"

5、E remove()

移除且返回LinkedList的头元素。

    LinkedList<String> list = new LinkedList<>();
    list.add("Java");
    list.add("Go");
    list.add("Python");
    list.remove(); //Java被删除

6、E remove(int index)

按照指定位置移除元素。

    LinkedList<String> list = new LinkedList<>();
    list.add("Java");
    list.add("Go");
    list.add("Python");
    list.remove(1); //列表中的第二个元素被删除

7、boolean remove(Object o)

在LinkedList中移除指定的元素。

    LinkedList<String> list = new LinkedList<>();
    list.add("Java");
    list.add("Go");
    list.add("Python");
    list.remove("Go"); //Go被删除

8、void clear()

移除LinkedList中的所有元素。这个方法很快,它只需要O(1)时间。

    LinkedList<String> list = new LinkedList<>();
    list.add("Java");
    list.add("Go");
    list.add("Python");
    list.clear(); //清空所有元素

三、LinkedList与Stack

1、什么是Stack

堆栈(英语:stack)又称栈或堆叠,是计算机科学中的一种抽象数据类型。只能在某一端(称为栈顶,top)进行加入数据(push)和读取数据(pop)的运算。

这里,我们将LinkedList和Stack进行比较,探究它们之间的联系。

首先,我们先来看一下用ArrayList实现Stack的方法。

    class Stack
    {
        private ArrayList<Object> data = new ArrayList<Object>();

        public void push(Object o)
        {
            data.add(o);
        }

        public Object pop() throws Exception
        {
            if(data.size() <= 0)
            {
                throw new Exception("Stack is empty");
            }
            return data.remove(data.size()-1);
        }

        public boolean isEmpty()
        {
            return data.size() == 0;
        }

        public Object peek() throws Exception
        {
            if(data.size() <=0)
            {
                throw new Exception("Stack is empty");
            }
            return data.get(data.size()-1);
        }
    }

接下来看用LinkedList实现Stack的方法。

    class Stack
    {
        private LinkedList<Object> linkdata = new LinkedList<Object>();

        public void push(Object o)
        {
            linkdata.addFirst(o);
        }

        public Object pop() throws Exception
        {
            if(linkdata.isEmpty())
            {
                throw new Exception("Stack is empty");
            }
            return linkdata.removoFirst();
        }

        public boolean isEmpty()
        {
            return linkdata.size() == 0;
        }

        public Object peek() throws Exception
        {
            if(linkdata.isEmpty())
            {
                throw new Exception("Stack is empty");
            }
            return linkdata.getFirst();
        }
    }

显然的,用LinkedList实现Stack是一项很简单的任务,只需要将addFirst方法替换成push方法即可。LinkedList也实现了Deque,removeFirst方法也等同于pop方法。

四、LinkedList与Queue

1、什么是Queue

队列(英语:Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(FIFO, First In First Out)的数据结构,队列中出现的元素称为队元素,新元素的插入称为入队,而队列允许删除操作的一端则称为队头。

下面看一下如何用LinkedList实现一个Queue.

    class Queue
    {
        private LinkedList<Object> queue = new LinkedList<>();

        //入队
        public void enqueue(Object o)
        {
            queue.addLast(o);
        }
        //出队
        public Object dequeue() throws NoSuchMethodException
        {
            if(queue.isEmpty())
            {
                throw new NoSuchMethodException("Queue is Empty");
            }
            return queue.removeFirst();
        }
        //是否为空
        public boolean isEmpty()
        {
            return queue.isEmpty();
        }
        //打印队列
        public void printQueue()
        {
            System.out.print("[");
            for(int i=0;i < queue.size();i++)
            {
                System.out.print(queue.get(i)+" ");
            }
            System.out.print("]\n");
        }
    }

五、LinkedList的优缺点

1、优点

①随机访问ArrayList比LinkedList快,因为ArrayList可以直接访问内存地址;而LinkedList需要遍历元素。但是ArrayList在插入和删除元素时的效率较低。

②LinkedList内部是双向链表,所以它可以分别访问首元素和尾元素;

③LinkedList可以充当队列和堆栈;不需要更改底层的实现即可提供这两种数据结构的行为。

2、缺点

虽然LinkedList提供了一种可调整大小的数组的替代方案,但是,在性能和时间方面,它会比ArrayList更慢。也就是说,它在访问集合中的任何给定元素方面效率较低。

所以,在迭代过程中,维护开销可能会很大,因为在迭代一半之前,我们不知道它的方向。

六、总结

LinkedList是Java中的一个双向链表类。它比Arraylist在插入和删除操作更加高效。它可以访问首尾元素,可以充当队列和堆栈,添加与删除操作快。但是,在访问集合中的任何给定元素方面效率较低。所以要根据具体应用场景进行选择。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/237174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:03
下一篇 2024-12-12 12:03

相关推荐

  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论