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

news2024/10/2 20:31:21

 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.coloradmin.cn/o/1505191.html

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

相关文章

【工具】Git的24种常用命令

相关链接 传送门&#xff1a;>>>【工具】Git的介绍与安装<< 1.Git配置邮箱和用户 第一次使用Git软件&#xff0c;需要告诉Git软件你的名称和邮箱&#xff0c;否则无法将文件纳入到版本库中进行版本管理。 原因&#xff1a;多人协作时&#xff0c;不同的用户可…

1分钟带你学会使用装饰器编写Python函数

1.需求 向 test() 函数中&#xff0c;新增一个功能&#xff0c;多输出一句话"给他补铁" def test():print("水中放吸铁石") # test()# 第一种方式&#xff1a;重写函数 def test():print("水中放吸铁石")print("给他补铁") test()# …

ARM-v7 程序计数器PC的相关指令与应用

1. 前言 如图1所示&#xff0c;R14是连接寄存器&#xff08;Link Register&#xff09;&#xff0c;在汇编指令中通常也写为LR&#xff0c;用于存储函数调用和异常等的返回信息&#xff0c;复位时&#xff0c;默认值为0xFFFFFFFF&#xff1b; 图1 Core register R15是程序计数…

从 iPhone 设备恢复误删微信消息的 4 种方法

您的微信消息可能会因无意删除、系统崩溃、卸载微信应用或升级过程失败而被删除。如果您遇到这种情况&#xff0c;您不必担心&#xff0c;因为您可以采取某些步骤来恢复丢失的微信历史记录。这里有 4 种方法可以帮助您从 iPhone恢复丢失的微信消息、群聊历史记录或微信联系人。…

函数柯里化:JavaScript中的高级技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【脚本玩漆黑的魅影】全自动刷努力值

文章目录 原理全部代码 原理 全自动练级&#xff0c;只不过把回城治疗改成吃红苹果。 吃一个可以打十下&#xff0c;背包留10个基本就练满了。 吃完会自动停止。 if img.getpixel(data_attack[0]) data_attack[1] or img.getpixel(data_attack_2[0]) data_attack_2[1]: # …

Solidity Uniswap V2 价格预言机

预言机是连接区块链与链下服务的桥梁&#xff0c;这样就可以从智能合约中查询现实世界的数据。Chainlink 是最大的oracle网络之一&#xff0c;创建于 2017 年&#xff0c;如今已成为许多 DeFi 应用的重要组成部分。https://github.com/XuHugo/solidityproject Uniswap 虽然是链…

matlab双目相机标定-需要什么参数、怎么获得

相机标定目的&#xff1a;获得相机内参、外参、畸变系数&#xff0c;摄像头的内参(f,1/dx,1/dy,cx,cy)、畸变参数(k1,k2,k3,p1,p1)和外参(R,t)&#xff0c;用于接下来的双目校正和深度图生成从而实现二维到三维的转换。 相机标定方法&#xff1a;opencv 双目相机标定以及立体…

Objects类 --java学习笔记

Objects类 Objects是一个工具类&#xff0c;提供了很多操作对象的静态方法给我们使用 Objects类常用的三个方法 Objects.equals 比直接equals更安全&#xff0c;因为Objects.equals里面做了非空校验 Objects.isNull&#xff08;A&#xff09; 等价于 A null Objects.non…

docker部署在线聊天室平台Fiora

Fiora 是一款开源免费的在线聊天系统 https://github.com/yinxin630/fiora 部署 创建docker网络 docker network create fiora-networkdocker-compose部署 vim docker-compose.yml version: 3 services:fiora_redis:image: rediscontainer_name: fiora_redisrestart: alway…

Springboot+vue的医院药品管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的医院药品管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…

AWS的CISO:GenAI只是一个工具,不是万能钥匙

根据CrowdStrike的年度全球威胁报告,尽管研究人员预计人工智能将放大对防御者和攻击者的影响,但威胁参与者在其行动中使用人工智能的程度有限。该公司上个月在报告中表示:“在整个2023年,很少观察到GenAI支持恶意计算机网络运营的开发和/或执行。” 对于GenAI在网络安全中的…

关于天线综合3(傅里叶变换法)

傅里叶变换法 如果令fd(w)为期望方向图&#xff0c;那么对应的电流分布id(s)为 但是&#xff0c;通常它的范围是无穷大的&#xff0c;所以我们通过近似解来截断id(s)如下 根据傅里叶变化&#xff0c;电流就会产生一个近似方向图f(w)。扩展至整个s域的电流id(s)产生准确的方向图…

CentOS 7.6安装部署Seafile服务器

今天飞飞和你们分享CentOS 7.6上安装基于MySQL/MariaDB的Seafile服务器的方法&#xff0c;包括下载和安装7.0.5版本、配置数据库、启动服务器等步骤。安装成功后&#xff0c;需要通过nginx反向代理才能访问seafile服务。 通过预编译好的安装包来安装并运行基于 MySQL/MariaDB …

【网站项目】109网上手机商城

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【NR 定位】3GPP NR Positioning 5G定位标准解读(七)- GNSS定位方法

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

L2-2 老板的作息表(Python)

作者 陈越 单位 浙江大学 新浪微博上有人发了某老板的作息时间表&#xff0c;表示其每天 4:30 就起床了。但立刻有眼尖的网友问&#xff1a;这时间表不完整啊&#xff0c;早上九点到下午一点干啥了&#xff1f; 本题就请你编写程序&#xff0c;检查任意一张时间表&#xff0c…

excel中去除公式,仅保留值

1.单个单元格去除公式 双击单元格&#xff0c;按F9. 2.批量去除公式 选中列然后复制&#xff0c;选择性粘贴&#xff0c;选值粘贴

边缘计算平台EdgeGallery前端源码分析03-应用测试认证平台

1 首页 &#xff08;1&#xff09;Nav导航栏 代码路径 atp\atp-fe\src\components\layout\Nav.vue &#xff08;2&#xff09;Banner图片区域 代码路径 atp\atp-fe\src\pages\home\Home.vue 点击详情跳转到 测试用例管理 页面&#xff08;后面分析&#xff09; <div cl…

交易平台开发:构建安全/高效/用户友好的在线交易生态圈

在数字化浪潮的推动下&#xff0c;农产品现货大宗商品撮合交易平台已成为连接全球买家与卖家的核心枢纽。随着电子商务的飞速发展&#xff0c;一个安全、高效、用户友好的交易平台对于促进交易、提升用户体验和增加用户黏性至关重要。本文将深入探讨交易平台开发的关键要素&…