浅聊java集合框架中的java.util.LinkedList

java集合框架总览

Java集合框架是一个用来代表和操纵集合的统一架构,它为管理和组织对象的集合提供了一组类和接口。这个框架包含三个主要部分:接口、实现和算法。

接口

  • Collection:这是集合框架的根接口,定义了集合的基本操作,如添加、删除、遍历等。
  • List:表示一个有序的集合(元素可以重复),它继承了Collection接口。
  • Queue:代表一种特殊的线性表,只允许在表的前端进行删除操作,而在表的后端进行插入操作。
  • Map:存储键值对(key-value pair)的集合。
  • Set:一个不包含重复元素的集合。

实现

  • ArrayList:List接口的一个实现,它使用一个数组来存储元素。ArrayList提供了快速的随机访问,但插入和删除操作可能较慢。
  • LinkedList:基于链表实现的List和Queue。它提供了快速的插入和删除操作,但随机访问可能较慢。
  • HashMap:基于哈希表实现的Map,提供了快速的键值对存储和检索。
  • TreeMap:基于红黑树实现的Map,可以对键进行排序。
  • HashSetTreeSet:都是Set接口的实现,其中HashSet基于哈希表,而TreeSet基于红黑树,可以对元素进行排序。

算法

  • 集合框架中的算法是指实现集合接口对象里的方法执行的一些有用的计算,例如搜索和排序。这些算法被称为多态,因为相同的方法可以在相似的接口上有着不同的实现。

 此外,Java集合框架还提供了一些其他重要的数据结构,如栈(Stack)和哈希表(Hash Table)。栈是一种后进先出(LIFO)的数据结构,Java中的Stack类或Deque接口的实现类(如ArrayDeque)可以用来实现栈的功能。哈希表则是一种以键值对形式存储数据的数据结构,Java中的HashMap和Hashtable等类提供了哈希表的实现。

Java集合框架的作用不仅在于提供了一种灵活且高效的方式来处理各种数据结构,包括列表、集合、映射等,还提供了丰富的数据操作和算法支持,如排序、过滤、映射、归约等,这对于数据处理非常重要。同时,它还有助于避免并发访问问题,提高程序的稳定性。

总的来说,Java集合框架是一个强大且灵活的工具,它使得Java编程在处理集合数据时更加高效和便捷。

 java.util.LinkedList

/**
 * Doubly-linked list implementation of the {@code List} and {@code Deque}
 * interfaces.  Implements all optional list operations, and permits all
 * elements (including {@code null}).
 *
 * <p>All of the operations perform as could be expected for a doubly-linked
 * list.  Operations that index into the list will traverse the list from
 * the beginning or the end, whichever is closer to the specified index.
 *
 * <p><strong>Note that this implementation is not synchronized.</strong>
 * If multiple threads access a linked list concurrently, and at least
 * one of the threads modifies the list structurally, it <i>must</i> be
 * synchronized externally.  (A structural modification is any operation
 * that adds or deletes one or more elements; merely setting the value of
 * an element is not a structural modification.)  This is typically
 * accomplished by synchronizing on some object that naturally
 * encapsulates the list.
 *
 * If no such object exists, the list should be "wrapped" using the
 * {@link Collections#synchronizedList Collections.synchronizedList}
 * method.  This is best done at creation time, to prevent accidental
 * unsynchronized access to the list:<pre>
 *   List list = Collections.synchronizedList(new LinkedList(...));</pre>
 *
 * <p>The iterators returned by this class's {@code iterator} and
 * {@code listIterator} methods are <i>fail-fast</i>: if the list is
 * structurally modified at any time after the iterator is created, in
 * any way except through the Iterator's own {@code remove} or
 * {@code add} methods, the iterator will throw a {@link
 * ConcurrentModificationException}.  Thus, in the face of concurrent
 * modification, the iterator fails quickly and cleanly, rather than
 * risking arbitrary, non-deterministic behavior at an undetermined
 * time in the future.
 *
 * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
 * as it is, generally speaking, impossible to make any hard guarantees in the
 * presence of unsynchronized concurrent modification.  Fail-fast iterators
 * throw {@code ConcurrentModificationException} on a best-effort basis.
 * Therefore, it would be wrong to write a program that depended on this
 * exception for its correctness:   <i>the fail-fast behavior of iterators
 * should be used only to detect bugs.</i>
 *
 * <p>This class is a member of the
 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
 * Java Collections Framework</a>.
 *
 * @author  Josh Bloch
 * @see     List
 * @see     ArrayList
 * @since 1.2
 * @param <E> the type of elements held in this collection
 */

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

java.util.LinkedList 是 Java 集合框架中的一部分,它实现了 List 接口和 Deque 接口,用于表示一个双向链表。与 ArrayList 不同的是,LinkedList 的内部元素不是连续存储的,而是通过节点(Node)来连接各个元素。这种结构使得 LinkedList 在插入、删除操作上具有较高的效率,但在访问元素时,其效率可能较低,因为需要从头节点或尾节点开始遍历

以下是 java.util.LinkedList 的一些主要特性和方法:

主要特性

  1. 双向链表LinkedList 实现了双向链表,因此可以从头部或尾部进行插入和删除操作。
  2. 动态大小:链表的大小可以动态增长和缩小,以适应添加或删除元素的需求。
  3. 线程不安全:与 ArrayList 一样,LinkedList 的非同步实现也是线程不安全的。如果多个线程同时修改链表,可能会导致数据不一致。在多线程环境中,可以考虑使用 Collections.synchronizedList 方法来包装 LinkedList,或者使用 CopyOnWriteArrayList 作为线程安全的替代方案。

主要方法

  1. 构造方法

    • LinkedList():创建一个空的双向链表。
    • LinkedList(Collection<? extends E> c):使用指定集合的元素来创建双向链表。
  2. 添加元素

    • add(E e):在链表末尾添加元素。
    • add(int index, E element):在指定位置插入元素。
    • addAll(Collection<? extends E> c):在链表末尾添加指定集合的所有元素。
    • addAll(int index, Collection<? extends E> c):从指定位置开始,将指定集合的所有元素插入链表。
    • addFirst(E e) 和 addLast(E e)(通过 Deque 接口):在链表头部或尾部添加元素。
  3. 删除元素

    • remove(int index):删除指定位置的元素。
    • remove(Object o):删除链表中第一个出现的指定元素。
    • removeAll(Collection<?> c):删除链表中所有包含在指定集合中的元素。
    • removeFirst() 和 removeLast()(通过 Deque 接口):删除链表头部或尾部的元素。
  4. 查找和访问元素

    • get(int index):返回指定位置的元素。
    • getFirst() 和 getLast()(通过 Deque 接口):返回链表头部或尾部的元素。
    • indexOf(Object o) 和 lastIndexOf(Object o):返回指定元素在链表中首次或最后出现的位置。
  5. 其他常用方法

    • size():返回链表中元素的数量。
    • isEmpty():检查链表是否为空。
    • clear():删除链表中的所有元素。
    • contains(Object o):检查链表中是否包含指定元素。
    • iterator() 和 descendingIterator():返回链表的迭代器,用于遍历链表。
    • listIterator(int index) 和 listIterator():返回链表的列表迭代器,用于在链表中双向遍历。

使用示例

下面是一个简单的示例,演示了如何使用 LinkedList

import java.util.LinkedList;  
  
public class LinkedListExample {  
    public static void main(String[] args) {  
        LinkedList<String> list = new LinkedList<>();  
          
        // 添加元素  
        list.add("A");  
        list.add("B");  
        list.add("C");  
          
        // 访问元素  
        System.out.println(list.get(1)); // 输出 "B"  
          
        // 删除元素  
        list.remove("B");  
          
        // 遍历元素  
        for (String item : list) {  
            System.out.println(item);  
        }  
    }  
}

 这个示例展示了如何创建一个 LinkedList,添加元素,访问元素,删除元素以及遍历元素。需要注意的是,在实际开发中,应根据具体需求选择合适的集合类型,并考虑线程安全性和性能问题。

躲不掉的ArrayList与LinkedList对比

ArrayList和LinkedList在Java集合框架中都是用于存储元素的线性列表,但它们之间存在几个关键的区别,这些区别主要体现在内部数据结构、性能特性、内存占用以及线程安全性等方面。

内部数据结构

  • ArrayList:ArrayList是基于动态数组实现的。它使用一个可增长的数组来存储元素。由于数组在内存中是连续存储的,因此ArrayList在随机访问元素时非常高效。
  • LinkedList:LinkedList是基于双向链表实现的。它使用节点来存储元素,每个节点包含数据和指向前后节点的引用。这种结构使得LinkedList在插入和删除元素时更加灵活。

性能特性

  • 访问元素:由于ArrayList是基于数组的,所以通过索引访问元素(get和set操作)非常快,时间复杂度为O(1)。而LinkedList需要从头或尾开始遍历才能访问到特定位置的元素,因此其访问操作的时间复杂度为O(n)。
  • 插入和删除元素:在ArrayList中,如果在列表的中间位置插入或删除元素,可能需要移动大量的元素以保持数组的连续性,这会导致性能下降。相比之下,LinkedList的插入和删除操作只需要修改相关节点的指针指向,因此性能更好。特别是在列表的头尾位置进行插入和删除时,LinkedList的效率非常高。

内存占用

  • ArrayList在内存中占用连续的空间,因此其内存利用率相对较高。而LinkedList的每个节点除了存储数据外,还需要存储指向前后节点的引用,这增加了额外的内存开销。

线程安全性

  • ArrayList和LinkedList都不是线程安全的。如果在多线程环境下使用它们,需要手动进行同步处理或使用线程安全的替代品,如Collections.synchronizedList()CopyOnWriteArrayList

扩容机制

  • 当ArrayList的容量不足以容纳更多元素时,它会创建一个新的更大的数组,并将原数组中的元素复制到新数组中。这个过程可能会涉及大量的数据移动。而LinkedList则没有扩容的问题,因为它是基于链表的,可以动态地添加和删除节点。

ArrayList基于数组实现,其元素在内存中是连续存储的。这种连续性存储有助于节省空间,因为数组元素之间没有额外的指针或引用。然而,当ArrayList需要扩容时(即当添加元素导致当前数组容量不足时),它会创建一个新的更大的数组,并将原数组中的元素复制到新数组中。这个扩容过程可能会涉及到一定的内存开销。

LinkedList则基于链表实现,其每个节点包含数据和指向前后节点的引用。这种结构使得LinkedList在内存占用上相对较为分散。由于每个节点除了存储数据本身外,还需要额外的空间来存储指针或引用,因此LinkedList在存储相同数量的元素时,可能会占用更多的内存。此外,由于链表不是连续存储的,所以可能会存在内存碎片的问题,进一步增加了内存管理的复杂性。

然而,需要注意的是,内存占用的比较并不只是简单的“ArrayList比LinkedList更节省内存”或“LinkedList比ArrayList占用更多内存”。实际情况取决于多个因素,包括元素的数量、元素的大小、ArrayList的扩容频率以及具体应用场景等。在某些情况下,ArrayList可能由于减少了指针的开销而更节省内存;而在其他情况下,LinkedList可能由于更好的空间利用率而占用更少的内存。

关于ArrayList与LinkedList的选择

在实际应用中,选择ArrayList还是LinkedList并没有绝对的“哪种更好”的答案,而是取决于具体的应用场景和需求。下面是一些指导原则,可以帮助你做出选择:

访问模式

  • 如果你需要频繁地访问列表中的元素,特别是通过索引访问,那么ArrayList通常会是更好的选择。由于ArrayList是基于数组的,通过索引访问元素非常快速。
  • 相反,如果你主要是从头或尾开始遍历列表,或者进行插入和删除操作,那么LinkedList可能更合适。LinkedList的双向链表结构使得这些操作更加高效。

插入和删除操作

  • 如果你需要在列表的中间位置频繁地插入或删除元素,LinkedList的性能通常优于ArrayList。因为ArrayList在插入或删除元素时可能需要移动大量的元素以保持数组的连续性,而LinkedList只需要修改相关节点的指针指向。
  • 然而,如果你在列表的末尾添加元素,ArrayList的add方法通常比LinkedList更快,因为ArrayList的容量可以预先分配,而LinkedList则需要创建新的节点并更新指针。

内存占用

  • 在内存占用方面,ArrayList通常比LinkedList更紧凑,因为它在内存中是连续存储的。但是,当ArrayList需要扩容时,会涉及到创建新数组和复制元素的过程,这可能会增加临时的内存开销。
  • LinkedList由于每个节点都需要存储数据和指针,因此可能会占用更多的内存。然而,如果元素数量很大且ArrayList频繁扩容,那么LinkedList的内存占用可能会相对更稳定。

线程安全性

  • ArrayList和LinkedList都不是线程安全的。如果你在多线程环境下使用它们,需要手动进行同步处理或使用线程安全的替代品。因此,在选择数据结构时,还需要考虑线程安全性的需求。

其他考虑因素

  • 如果你正在处理大量数据且内存使用是一个关键问题,那么可能需要考虑使用更高效的数据结构或库,如Java中的ArrayDeque或第三方库提供的数据结构。
  • 如果你正在编写性能敏感的代码,那么最好进行基准测试以比较不同数据结构在实际应用中的性能表现。

综上所述,选择ArrayList还是LinkedList取决于你的具体需求和应用场景。在实际应用中,建议根据访问模式、插入和删除操作的频率、内存占用以及线程安全性等因素进行综合考虑,并可能需要进行基准测试来确定最佳的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 上传视频

controlslist 属性可以用于告诉浏览器在视频播放过程中应该显示哪些默认的用户界面控件 代码&#xff1a; <template><div class"schematicDiagramIndex"><el-container><el-header v-if"this.radiooCar1"><el-button click&qu…

【精选】发布应用到应用商店的基本介绍

摘要 本文旨在介绍如何在各大应用商店发布应用&#xff0c;包括市场选择、准备材料、上架步骤以及常见被拒原因及解决方法。通过详细的步骤和经验分享&#xff0c;帮助开发者顺利将应用推向市场。 引言 随着移动应用市场的不断发展&#xff0c;越来越多的开发者希望将他们的…

如何关闭WordPress的自动更新功能

Wordpress为什么自动更新 WordPress自动更新是为了提供更好的安全性和稳定性。 安全性&#xff1a;WordPress是一个广泛使用的内容管理系统&#xff0c;因此成为恶意攻击的目标。WordPress的自动更新功能确保你的网站及时获得最新的安全补丁和修复程序&#xff0c;以保护你的网…

自动化测试selenium(1)

目录 什么是自动化测试 自动化测试 单元测试 接口测试 UI自动化测试 适合做自动化测试的项目 如何实施自动化测试 自动化测试需要了解的技能 selenium介绍 特性 原理 什么是自动化测试 自动化测试 自动化测试是指软件测试的自动化, 在预设状态下运行应用程序或者系…

标准 I/O 库

直接使用系统调用的缺点&#xff1a; (1) 影响系统性能 系统调用比普通函数调用开销大 因为&#xff0c;频繁的系统调用要进行用户空间和内核空间的切换 (2) 系统调用一次所能读写的数据量大小&#xff0c;受硬件的限制 解决方案&#xff1a;使用带缓冲功能的标准I/O库&#x…

RocketMQ笔记(七)SpringBoot整合RocketMQ发送事务消息

目录 一、简介1.1、流程图1.2、事务消息流程介绍 二、Maven依赖三、生产者3.1、application配置3.2、员工表3.3、实体3.4、持久层3.5、监听器 四、测试4.1、普通消息4.2、事务消息4.2.1、消费者4.2.2、正常提交4.2.3、异常提交 五、其他5.1、接口说明5.2、checkLocalTransactio…

智能传真机触摸屏中应用的触摸感应芯片

智能传真机是应用扫描和光电变换技术&#xff0c;把文件、图表、照片等静止图像转换成电信号&#xff0c;传送到接收端&#xff0c;以记录形式进行复制的通信设备。智能传真机将需发送的原件按照规定的顺序&#xff0c;通过光学扫描系统分解成许多微小单元&#xff08;称为像素…

AXS4110 单节锂电池保护芯片 爱协生 兼容XB6042/CM1124 低成本

概述 AXS4110系列产品是一种针对锂离子或聚合物电池保护的高集成解决方案芯片。AXS4110系列包含先进的功率MOSFET、高精度电压检测电路和延时电路。AXS4110系列采用DFN1x1x0.37_4封装&#xff0c;使其成为小体积电池保护的理想解决方案。 AXS4110具有过充、过放、过流、0V充电…

SpirngBoot开发常用知识

springboot开发常用知识 命令行打包SpringBoot打包插件window端口命令临时属性设置热部署启动热部署热部署范围 常用计量单位数据校验加载测试的专用属性Web环境模拟测试如何发送虚拟请求业务层测试回滚随机产生测试用例内置数据源 命令行打包 对SpringBoot项目进行打包命令行…

液冷是大模型对算力需求的必然选择?|英伟达 GTC 2024六大亮点

在这个以高性能计算和大模型推动未来通用人工智能时代&#xff0c;算力已成为科技发展的隐形支柱。本文将重点探讨算力的演进&#xff0c;深入分析在不同领域中算力如何成为推动进步的基石&#xff1b;着眼于液冷如何突破算力瓶颈成为引领未来的先锋&#xff0c;对液冷散热的三…

智慧城市中的物联网革命——青创智通

工业物联网解决方案-工业IOT-青创智通 得益于物联网 (IoT)的变革力量&#xff0c;智慧城市的概念正在迅速成为现实。物联网正在从根本上改变城市的运作方式&#xff0c;为城市居民带来更高的效率、可持续性和生活质量。在本文中&#xff0c;我们将探讨物联网在智慧城市中的作用…

小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

面对DDOS攻击,有哪些解决办法

随着互联网带宽的持续增长以及DDOS黑客技术的发展&#xff0c;DDOS拒绝服务攻击的实施变得愈发容易。商业竞争、打击报复、网络敲诈等多种因素&#xff0c;各行各业的用户都曾受到DDOS攻击的威胁。 一旦遭受到DDOS攻击&#xff0c;随之而来的就是业务宕机&#xff0c;用户无法…

【必看】网络安全从业者书单推荐

推荐几本网络安全从业者必读的书籍 一、计算机基础 《网络硬件设备完全技术宝典》&#xff08;第3版&#xff09; 本书共768页&#xff0c;包括交换机、路由器、安全设备、网络设备等重要和常用的网络设备&#xff0c;图文并茂&#xff0c;语言流畅&#xff0c;内容及其丰富…

NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法技术回顾七年发展脉络梳理

NL2SQL基础系列(2)&#xff1a;主流大模型与微调方法精选集&#xff0c;Text2SQL经典算法技术回顾七年发展脉络梳理 Text-to-SQL&#xff08;或者Text2SQL&#xff09;&#xff0c;顾名思义就是把文本转化为SQL语言&#xff0c;更学术一点的定义是&#xff1a;把数据库领域下的…

MQ之————如何保证消息的可靠性

MQ之保证消息的可靠性 1.消费端消息可靠性保证&#xff1a; 1.1 消息确认&#xff08;Acknowledgements&#xff09;&#xff1a; 消费者在接收到消息后&#xff0c;默认情况下RabbitMQ会自动确认消息&#xff08;autoAcktrue&#xff09;。为保证消息可靠性&#xff0c;可以…

如何用Python编写简单的网络爬虫(页面代码简单分析过程)

一、什么是网络爬虫 在当今信息爆炸的时代&#xff0c;网络上蕴藏着大量宝贵的信息&#xff0c;如何高效地从中获取所需信息成为了一个重要课题。网络爬虫&#xff08;Web crawler&#xff09;作为一种自动化工具&#xff0c;可以帮助我们实现这一目标&#xff0c;用于数据分析…

发挥自定义表单开源优势,助力实现流程化办公!

在数字化发展进程中&#xff0c;利用低代码技术平台、自定义表单开源的优势特点&#xff0c;可以让企业实现流程化办公&#xff0c;从而实现提质增效的办公目的。作为一种新兴的应用开发模式&#xff0c;低代码技术平台获得了很多新老客户朋友的青睐和喜爱&#xff0c;正以它自…

静力水准仪如何进行数据获取及转换?

静力水准仪作为现代测量技术中的一项重要工具&#xff0c;通过利用磁致伸缩效应实现了对被测物体沉降量的高精度测量。本文将介绍磁致式静力水准仪数据获取的原理与方法&#xff0c;以及数据转换的过程&#xff0c;探讨其在工程安全监测领域的应用价值。 数据获取原理 静力水准…

【QT入门】 Qt自定义控件与样式设计之QPushButton点击按钮弹出菜单

往期回顾&#xff1a; 【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QComboBox样式表介绍-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QCheckBox qss实现按钮开关-CSDN博客 【QT入门】 Qt自定义…