Java中常用的集合及方法(3)

 1、List(接上级--常用方法示例补充)

1.4 常用的方法

1.4.2 LinkedList(JDK8)

LinkedList是Java中一个实现了List接口和Deque接口的类,它采用链表结构存储数据,支持高效的插入和删除操作。

LinkedList中的所有方法及使用

使用示例:
 1、构造方法
LinkedList<String> list = new LinkedList<>();
2、添加元素
// 在链表末尾添加元素
list.add("Apple");// 在指定索引位置插入元素
list.add(0, "Banana");
3、删除元素
// 删除第一个元素(头节点)
String removedHead = list.removeFirst();// 删除最后一个元素(尾节点)
String removedTail = list.removeLast();// 删除特定对象首次出现的位置
if (list.contains("Apple")) {list.removeFirstOccurrence("Apple");
}// 删除特定对象最后一次出现的位置
if (list.contains("Apple")) {list.removeLastOccurrence("Apple");
}// 移除链表中的第一个元素  
list.remove(); // 根据索引删除元素
list.remove(0);// 移除指定元素(首次出现的)  
list.remove("Apple"); // 如果存在的话,移除Apple// 移除所有指定元素集合  
list.removeAll(java.util.Arrays.asList("Apple", "Banana")); // 移除所有Apple和Banana(如果存在)
4、获取元素
// 获取第一个元素(头节点)
String firstItem = list.getFirst();// 获取最后一个元素(尾节点)
String lastItem = list.getLast();// 获取索引位置的元素
String itemAtIndex = list.get(0);
5、设置元素
// 设置第一个元素(头节点)
list.setFirst("Cherry");// 设置最后一个元素(尾节点)
list.setLast("Cherry");// 根据索引设置元素
list.set(0, "Cherry");
6、遍历和查找元素
// 使用迭代器遍历
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
}// 使用for-each循环遍历
for (String element : list) {System.out.println(element);
}// 查找元素是否存在
boolean contains = list.contains("Cherry");// 获取元素的索引
int index = list.indexOf("Cherry");// 查找指定元素最后一次出现的索引  
int lastIndex = list.lastIndexOf("Banana"); // 查找Banana的最后一个索引(如果只有一个,则和indexOf一样)
7、其他操作
// 获取列表大小(元素数量)
int size = list.size();// 清空列表
list.clear();// 判断列表是否为空
boolean isEmpty = list.isEmpty();// 在链表头部添加元素
list.addFirst("Orange");// 在链表尾部添加元素
list.addLast("Grape");// 从链表头部弹出并返回元素
String poppedHead = list.pop();// 从链表尾部移除并返回元素
String polledTail = list.pollLast();// 检查链表是否包含另一个集合的所有元素
boolean allElementsPresent = list.containsAll(anotherList);// 移除链表中所有与另一个集合相同的元素
list.removeAll(anotherList);// 截取子列表
List<String> sublist = list.subList(fromIndex, toIndex);
8、排序操作

由于LinkedList实现了List接口,因此可以使用Collections.sort()进行排序,但请注意这将创建一个新的ArrayList来完成排序,并在排序后替换原链表内容。

Collections.sort(list);

如果是对某个实体类,需要根据不同的字段或逻辑来排序,也可以创建一个Comparator

例:

import java.util.Collections;  
import java.util.Comparator;  
import java.util.LinkedList;  public class LinkedListExample {  public static void main(String[] args) {  LinkedList<Person> list = new LinkedList<>();  list.add(new Person("Alice", 25));  list.add(new Person("Bob", 20));  list.add(new Person("Charlie", 30));  // 自定义排序,按照年龄升序排序  Collections.sort(list, new Comparator<Person>() {  @Override  public int compare(Person p1, Person p2) {  return Integer.compare(p1.age, p2.age);  }  });  // 输出: [Bob, Alice, Charlie] 此处Person类需重写toString方法  System.out.println(list); }  
}  class Person {  String name;  int age;  public Person(String name, int age) {  this.name = name;  this.age = age;  }  @Override  public String toString() {  return name + " " + age;  }  
}

或者是使用 Java 8 的 Lambda 表达式进行排序:

import java.util.Collections;  
import java.util.LinkedList;  
import java.util.Comparator;  public class LinkedListExample {  public static void main(String[] args) {  LinkedList<Person> list = new LinkedList<>();  list.add(new Person("Alice", 25));  list.add(new Person("Bob", 20));  list.add(new Person("Charlie", 30));  // 使用 Lambda 表达式进行自定义排序,按照年龄升序排序 :Person类需有getAge方法  Collections.sort(list, Comparator.comparingInt(Person::getAge));  // 输出: [Bob, Alice, Charlie] System.out.println(list); }  
}  class Person {  String name;  int age;  public Person(String name, int age) {  this.name = name;  this.age = age;  }  public int getAge() {  return age;  }  @Override  public String toString() {  return name + " " + age;  }  
}
适合使用的场景:
  1. 频繁增删的场景:LinkedList在插入和删除元素时具有较高的效率,特别适用于需要频繁进行这些操作的情况。例如,当需要在列表的头部或中间位置插入或删除元素时,LinkedList是一个很好的选择。
  2. 头尾操作或插入指定位置的场景:LinkedList允许在链表的两端以及任何指定位置进行高效的插入和删除操作。这使得它在需要灵活操作列表不同位置的场景中特别有用。
  3. 顺序访问的场景:如果应用需要按照顺序访问列表中的元素,而不是随机访问,那么LinkedList可能是一个合适的选择。因为LinkedList是通过节点链接实现的,所以在顺序访问时性能较好。

注意:

        虽然LinkedList在插入和删除操作上具有优势,但在随机访问方面可能不如ArrayList高效。因此,在选择使用LinkedList还是其他数据结构时,需要根据具体应用场景的性能需求进行权衡。

        此外,还需要注意LinkedList的内存使用情况。由于LinkedList的每个节点都需要消耗一定的空间来存储数据和指针,因此在处理大量数据时,可能会占用更多的内存。因此,在使用LinkedList时,也需要关注内存管理和优化。

使用场景示例:
  1. 实现队列或栈:LinkedList可以作为队列(Queue)或栈(Stack)的数据结构实现。队列是一种先进先出(FIFO)的数据结构,常用于处理需要按顺序处理的任务或事件,如打印任务队列。栈是一种后进先出(LIFO)的数据结构,常用于需要按相反顺序处理元素的情况,如函数调用栈。LinkedList的节点可以通过其指针关系方便地实现这些操作。
  2. 链表操作算法:在需要实现链表相关的算法时,LinkedList是一个很好的选择。例如,你可以使用LinkedList来实现链表的合并、反转、排序等算法。这些算法通常需要对链表进行频繁的插入和删除操作,LinkedList的高效性使得这些算法的实现更加高效。
  3. 动态插入和删除元素:在某些应用中,可能需要频繁地在列表的任意位置插入或删除元素。例如,在一个需要用户动态添加和删除任务的待办事项列表中,LinkedList就能够提供高效的插入和删除操作。由于LinkedList不需要像ArrayList那样移动大量元素来保持连续的内存空间,因此在这种场景下,LinkedList的性能优势会更为明显。
使用时需要注意的问题:

在使用LinkedList时,需要注意以下几个关键问题:

  1. 节点数据的准确性:确保链表中的每个节点都包含正确的数据。在插入或修改节点数据时,需要仔细核对数据的正确性,避免因为数据错误导致链表的状态不一致。

  2. 节点指针的正确性:LinkedList中的每个节点都有一个指向下一个节点的指针。在插入、删除或修改节点时,必须确保这些指针的正确性。如果指针设置错误,可能会导致链表断裂或形成循环,从而破坏链表的完整性。

  3. 内存管理:在创建新节点时,需要分配内存;在删除节点时,需要释放内存。必须确保在合适的时机进行内存分配和释放,避免内存泄漏或内存不足的问题。

  4. 并发安全:LinkedList不是线程安全的。在多线程环境下,如果多个线程同时修改LinkedList,可能会导致数据不一致或其他并发问题。因此,在并发环境下使用LinkedList时,需要采取适当的同步措施,例如使用锁或同步块来保护链表的访问和修改操作。

  5. 遍历和访问方式:LinkedList是基于节点链接实现的,因此在遍历和访问链表元素时,需要使用迭代器或循环遍历的方式。在遍历过程中,需要注意避免死循环或跳过某些节点的问题。同时,由于LinkedList在随机访问方面不如ArrayList高效,因此在需要频繁进行随机访问的场景下,ArrayList可能更合适。

  6. 性能考虑:虽然LinkedList在插入和删除元素时具有较高的效率,但在遍历元素时可能不如ArrayList快。因此,在选择使用LinkedList还是ArrayList时,需要根据具体应用场景的性能需求进行权衡。

LinkedList的扩容?

注意:LinkedList不存在扩容的说法

        因为LinkedList是基于双向链表实现的,它没有固定的初始化大小,也没有特定的扩容机制。原因在于链表结构的特点使其可以在需要时动态地添加或删除节点,而不需要像数组那样预先分配或调整固定大小的内存空间。因此,LinkedList在添加元素时,只需要在链表头部或尾部创建新的节点,或者在指定位置插入新的节点即可。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10阿里云实现内网穿透#frp

win10&阿里云实现内网穿透#frp 文章目录 win10&阿里云实现内网穿透#frp一、什么是内网穿透&#xff1f;下载frp 二、云服务端部署frps三、本地部署frpc 一、什么是内网穿透&#xff1f; 内网穿透是一种网络技术&#xff0c;它允许外部网络用户通过互联网访问局域网&am…

【Java核心能力】RateLimiter 限流底层原理解析

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

第89篇:方程式工具包远程溢出漏洞图形界面版V0.3(内置永恒之蓝、永恒冠军、永恒浪漫等)...

Part1 前言 大家好&#xff0c;我是ABC_123。我从年前到现在&#xff0c;一直在整理曾经写过的红队工具&#xff0c;逐步把自己认为比较好用的原创工具发出来给大家用一用&#xff0c;方便大家在日常的攻防比赛、红队评估项目中解放双手&#xff0c;节省时间精力和体力。本期给…

C语言实战——扫雷游戏

目录 1. 扫雷游戏分析和设计2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1.1扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷 如果位置不是雷&#xff0c;就显示周围有几个雷 如果…

mysql 性能优化——磁盘刷脏页性能优化

前言 大家是不是感觉mysql 更新挺快的呀&#xff0c;有没有想过mysql 更新为什么那么快。按道理说&#xff0c;mysql 更新都是先找到这一行数据&#xff0c;然后在去更新。意味着&#xff0c;就有两次磁盘操作&#xff0c;一个是磁盘读&#xff0c;一个是磁盘写。如果真的是这…

工业以太网交换机助力电力综合自动化系统卓越运行

随着电力行业不断迈向数字化和自动化时代&#xff0c;电力综合自动化系统逐渐成为实现电网智能化管理的核心。在这一复杂而庞大的系统中&#xff0c;工业以太网交换机扮演着至关重要的角色&#xff0c;连接着各种智能设备&#xff0c;实现数据的快速传输和高效管理&#xff0c;…

c++ 串口通信库

根据资料整理的串口通信库&#xff0c;封装成为了动态库&#xff0c;使用者只需要调用接口即可 使用实例如下&#xff1a; //接受数据 void CSerialPortCommonLibDemoDlg::OnReceive() { char * str NULL; str new char[256]; _port.readAllData(str); CString s…

基于SpringBoo的火车订票管理系统(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

harmonyos arkts 开发商品页面

1.结果展示 2. 实现分层组件 1.1 实现搜索栏 1.2 代码 这段代码是一个构建搜索框组件的方法&#xff0c;具体功能包括&#xff1a; - 创建一个Search组件&#xff0c;设置初始值为this.keyword&#xff0c;placeholder为请输入书名... - 添加一个搜索按钮&#xff0c;并设置…

【经管数据-更新】华证ESG评级得分数据(2009-2023年)

一、数据说明 参考《经济研究》中方先明&#xff08;2023&#xff09;的做法&#xff0c;将华证ESG评级进行赋值&#xff0c;指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级&#xff0c;将上市公司ESG 等级从低到高分别赋值为1至9 二、数据来源&#xff1a;世界银行&am…

SPI读取TLE5012B编码器角度数据_ACM32G103

买到一个带编码器的电机&#xff0c;卖家留出来读取编码器数据的接口有SPI 具体的原理图如下&#xff1a; P2标注的是SPI的接口&#xff0c;其中MISO和MOSI是硬件连接到一起的 使用ACM32G103的硬件SPI2去读取其角度数据 原理大概如下&#xff1a; 1、先发送读取数据的指令&…

.NET高级面试指南专题十六【 装饰器模式介绍,包装对象来包裹原始对象】

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;用于动态地给对象添加额外的职责&#xff0c;而不改变其原始类的结构。它允许向对象添加行为&#xff0c;而无需生成子类。 实现原理&#xff1a; 装饰器模式通过创建一个包装对象来包裹原…

Mysql命令行客户端

命令行客户端 操作数据库操作数据表 操作数据库 mysql> create database mike charsetutf8; Query OK, 1 row affected (0.01 sec) mysql> show databases; -------------------- | Database | -------------------- | information_schema | | mike …

ARM基础----STM32处理器操作模式

STM32处理器操作模式 Cortex-M处理器操作模式、特权等级和栈指针操作模式栈指针CONTROL寄存器异常压栈时的SP指针 Cortex-A 处理器运行模型寄存器组 Cortex-M处理器操作模式、特权等级和栈指针 操作模式 处理模式&#xff1a;执行中断服务程序等异常处理&#xff0c;处理器具有…

STM32FreeRTOS信号量(STM32cube高效开发)

一、信号量 &#xff08;一&#xff09;信号量概括 信号量是操作系统中重要的一部分&#xff0c;信号量是一种解决同步问题的机制&#xff0c;可以实现对共享资源的有序访问。 FreeRTOS 提供了多种信号量&#xff0c;按信号量的功能可分为二值信号量、计数型信号量、互斥信…

宽度优先搜索算法(BFS)

宽度优先搜索算法&#xff08;BFS&#xff09;是什么&#xff1f; 宽度优先搜索算法&#xff08;BFS&#xff09;&#xff08;也称为广度优先搜索&#xff09;主要运用于树、图和矩阵&#xff08;这三种可以都归类在图中&#xff09;&#xff0c;用于在图中从起始顶点开始逐层…

指针--2

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.指针运算1.1.指针-整数1.2.指针-指针1.3.指针的关系运算 2.野指针2.1 野指针成因2.2 如何规避野指针 3.assert 断言4.指针的使用和传址调用4.1 strlen的模拟实…

【Tauri】(4):整合Tauri和actix-web做本地大模型应用开发,可以实现session 登陆接口,完成页面展示,进入聊天界面

1&#xff0c;视频地址 https://www.bilibili.com/video/BV1GJ4m1Y7Aj/ 【Tauri】&#xff08;4&#xff09;&#xff1a;整合Tauri和actix-web做本地大模型应用开发&#xff0c;可以实现session 登陆接口&#xff0c;完成页面展示&#xff0c;进入聊天界面 使用国内代理进行加…

6-DOF GraspNet: Variational Grasp Generation for Object Manipulation

总结&#xff1a; 使用变分自动编码器(VAE)对抓取进行采样&#xff0c;并使用基于点网的抓取评估器模型对采样的抓取进行评估和细化 摘要&#xff1a; 我们将抓取生成问题表述为 使用变分自编码器对一组抓取进行采样&#xff0c;并使用抓取评 估器模型对采样的抓取进行评估和…

备考2024年小学生古诗文大会:历年真题15题练习和独家解析

如何提高小学生古诗词的知识&#xff1f;如何激发小学生古诗词的学习兴趣&#xff1f;如何提高小学古诗词的学习成绩&#xff1f;如何备考2024年小学生古诗文大会&#xff1f;...如果你也在关心和这些问题&#xff0c;我的建议是参加每年一度的小学生古诗词大会&#xff08;免费…