百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

LinkedList使用详解

toyiye 2024-06-21 12:08 11 浏览 0 评论

概述

LinkedList是一个功能十分强大的集合,看它的名字可能误以为只有List顺序容器的功能,实际上它还可以作为一个双端队列,也可以作为一个栈来使用。那么我们以java8版本来对LinkedList做一个功能讲解和使用体验。

功能介绍

LinkedList底层的数据结构是双向的链表。

特点:

  • 底层数据结果是双向链表,插入删除速度快,查找速度慢。
  • LinkedList可以作为一个顺序容器使用
  • LInkedList可以作为一个队列使用,元素先进先出
  • LinkedList可以作为一个栈使用, 元素先进后出
  • 允许放入null元素
  • 不是线程安全,并发修改的时候会抛出ConcurrentModificationException异常

构造方法

  • LinkedList()

说明:构造一个空容器

  • LinkedList(Collection<? extends E> c)

说明:构造一个内容为入参容器c的的容器。

有序列表相关方法

  • boolean add(E e)

说明: 向集合中添加元素

  • void add(int index, E element)

说明: 向集合指定位置后面添加一个元素

  • boolean addAll(Collection<? extends E> c)

说明: 向集合中添加另外一个集合的元素

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

说明: 向集合指定位置后面添加另外一个集合的全部元素

  • E set(int index, E element)

说明: 设置集合中某个位置元素的值,返回修改前的内容

  • boolean remove(Object o)

说明:删除集合中碰到的第一和o一样的元素,如果集合发生变化返回true

  • E remove(int index)

说明:删除集合中某个位置的元素,返回删除的元素内容

  • boolean removeAll(Collection<?> c)

说明:根据入参的集合,删除集合里面一样的元素,如果集合发生变化,返回true

  • void clear()

说明:清空集合中的元素

  • int size()

说明:返回容器中元素的数量

  • boolean isEmpty()

说明:返回容器是否是空的,如果是空,返回true

  • boolean contains(Object o)

说明:返回容器是否包含指定对象

  • E get(int index)

说明:获取指定索引位置的元素

  • int indexOf(Object o)

说明:从头部开始找,获取查找到指定元素的第一个索引位置, 如果返回-1表示没有找到

队列相关方法

  • boolean offer(E e)

说明:队列中添加元素,往队列尾部添加元素

  • E poll()

说明:从队列中获取元素,拿到的是最先放进去的,也就是头部的元素

  • boolean offerFirst(E e)

说明:队列头部添加元素。

  • boolean offerLast(E e)

说明:队列尾部添加元素

  • E pollFirst()

说明:队列头部获取元素

  • E pollLast()

说明:队列尾部获取元素

栈相关方法

  • void push(E e)

说明:向栈中压入元素,也就是头部添加元素

  • E pop()

说明:从栈中获取元素,相当于从队列头部获取元素

  • E peek()

说明:查看栈顶元素

使用案例和总结

有序列表的使用

@Test
    public void testListFunc() {
        List<String> userNames = new LinkedList<>();
        userNames.add("alvin");
        userNames.add("cxw");
        userNames.add("hh");
        userNames.add("ss");

        String username = userNames.get(2);
        Assert.assertEquals("hh", username);
    }
复制代码

小结:

ArrayList 是基于动态数组数据结构的实现,访问元素速度优于 LinkedList。LinkedList 是基于链表数据结构的实现,占用的内存空间比较大,但在批量插入或删除数据时优于 ArrayList。

对于快速访问对象的需求,使用 ArrayList 实现执行效率上会比较好。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高。

队列的使用

@Test
    public void testQueueFunc() {
        Deque<String> userNames = new LinkedList<>();
        userNames.offer("alvin");
        userNames.offer("cxw");
        userNames.offer("kk");

        String username = userNames.poll();
        Assert.assertEquals("alvin", username);
    }
复制代码

小结: LinkedList可以支持队列的功能,底层通过队列实现,同样还有一个类ArrayDeque也支持,底层通过数组实现,通常情况下,ArrayDeque的性能和内存开销更优。

栈的使用

@Test
    public void testStackFunc() {
        Deque<String> userNames = new LinkedList<>();
        userNames.push("alvin");
        userNames.push("cxw");
        userNames.push("kk");

        String username = userNames.peek();
        Assert.assertEquals("kk", username);

        username = userNames.pop();
        Assert.assertEquals("kk", username);
    }
复制代码

小结: java中有个有Stack的类支持栈的功能,它是线程安全的,性能查,不推荐使用。LinkedList可以栈的功能,底层通过队列实现,同样还有一个类ArrayDeque也支持,底层通过数组实现,通常情况下,ArrayDeque的性能和内存开销更优。

使用注意事项

  1. LinkedList底层采用双向队列实现,不需要进行扩容操作,在频繁插入和删除的场景性能更佳。
  2. 在 subList 场景中,高度注意对父集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生 ConcurrentModificationException 异常。 说明:抽查表明,90% 的程序员对此知识点都有错误的认知。
  3. 使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全一致、长度为0 的空数组。
  4. 使用 Collection 接口任何实现类的 addAll() 方法时,要对输入的集合参数进行 NPE 判断。

说明:在 ArrayList#addAll 方法的第一行代码即 Object[] a = c.toArray();其中 c 为输入集合参数,如果为 null,则直接抛出异常。

  1. 不要在 foreach 循环里进行元素的 remove / add 操作。remove 元素请使用 iterator 方式,如果并发操作,需要对 iterator 对象加锁。
  2. 使用工具类 Arrays.asList() 把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/ remove / clear 方法会抛出 UnsupportedOperationException 异常。
  3. Collections 类返回的对象,如:emptyList() / singletonList() 等都是 immutable list,不可

对其进行添加或者删除元素的操作。

参考


来源:https://juejin.cn/post/7134602521423101983

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码