Java 按照添加顺序的集合 详解

在 Java 中,若需要按照添加顺序存储和操作元素,有以下几种数据结构可供选择。这些结构在保留元素插入顺序的同时提供了不同的功能特性。


1. 使用 ArrayList

特点
  • 有序性ArrayList 会按添加顺序存储元素。
  • 允许重复:可以存储重复的元素。
  • 随机访问:支持快速的按索引访问操作,时间复杂度为 O(1)
  • 线程不安全:默认情况下非线程安全,需手动同步。
示例
import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Cherry");System.out.println("ArrayList: " + list); // 输出: [Apple, Banana, Cherry]}
}

2. 使用 LinkedList

特点
  • 有序性LinkedList 按照插入顺序存储元素。
  • 允许重复:支持重复的元素。
  • 高效插入和删除:在头部或尾部插入、删除操作时间复杂度为 O(1),但随机访问性能较差(时间复杂度 O(n))。
  • 双向链表实现:支持队列、栈等功能操作。
示例
import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();list.add("Apple");list.add("Banana");list.add("Cherry");System.out.println("LinkedList: " + list); // 输出: [Apple, Banana, Cherry]}
}

3. 使用 LinkedHashSet

特点
  • 有序性LinkedHashSet 会按照元素的插入顺序存储。
  • 去重:不允许存储重复元素。
  • 底层实现:基于 HashMap 和双向链表。
  • 适用场景:需要保留插入顺序,同时需要去重的场景。
示例
import java.util.LinkedHashSet;public class LinkedHashSetExample {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<>();set.add("Apple");set.add("Banana");set.add("Cherry");set.add("Apple"); // 重复元素将被忽略System.out.println("LinkedHashSet: " + set); // 输出: [Apple, Banana, Cherry]}
}

4. 使用 LinkedHashMap

特点
  • 有序性LinkedHashMap 按照插入顺序存储键值对。
  • 允许重复值:键不能重复,但值可以重复。
  • 快速访问:支持通过键快速访问值(时间复杂度为 O(1))。
  • 底层实现:基于 HashMap 和双向链表。
  • 适用场景:需要保留键值对的插入顺序。
示例
import java.util.LinkedHashMap;public class LinkedHashMapExample {public static void main(String[] args) {LinkedHashMap<Integer, String> map = new LinkedHashMap<>();map.put(1, "Apple");map.put(2, "Banana");map.put(3, "Cherry");System.out.println("LinkedHashMap: " + map); // 输出: {1=Apple, 2=Banana, 3=Cherry}}
}

5. 使用 Stream 收集为有序集合

如果数据来源是无序的,例如 HashSet 或原始数组,Java 的 Stream API 提供了一种方式,将数据按插入顺序转换为有序集合。

示例:收集为 List
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamOrderedExample {public static void main(String[] args) {List<String> list = Arrays.asList("Cherry", "Apple", "Banana");List<String> orderedList = list.stream().collect(Collectors.toList()); // 保持原始顺序System.out.println("Ordered List: " + orderedList); // 输出: [Cherry, Apple, Banana]}
}
示例:收集为 LinkedHashSet
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.stream.Collectors;public class StreamToOrderedSet {public static void main(String[] args) {List<String> list = Arrays.asList("Apple", "Banana", "Cherry", "Apple");Set<String> orderedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new));System.out.println("Ordered Set: " + orderedSet); // 输出: [Apple, Banana, Cherry]}
}

6. 各种数据结构的性能对比

数据结构插入顺序允许重复时间复杂度:插入时间复杂度:查找时间复杂度:删除备注
ArrayList保持插入顺序允许O(1)(尾部)O(1)(按索引)O(n)(中间元素)适合频繁访问,但插入删除较慢
LinkedList保持插入顺序允许O(1)(头/尾)O(n)(随机访问)O(1)(头/尾)插入和删除效率高,适合队列场景
LinkedHashSet保持插入顺序不允许O(1)O(1)O(1)适合需要顺序且去重的场景
LinkedHashMap保持插入顺序键不能重复O(1)O(1)O(1)适合需要顺序且键值对存储的场景
Stream按数据源的顺序处理可控与数据源有关与数据源有关与数据源有关灵活,但主要用于一次性操作

总结

在 Java 中,以下集合可以按添加顺序存储数据:

  1. ArrayListLinkedList:适合需要频繁增删、按顺序访问的场景。
  2. LinkedHashSetLinkedHashMap:适合需要顺序存储并去重或键值对操作的场景。
  3. Stream:用于一次性操作,将无序数据转为有序集合。

根据实际需求,选择适合的数据结构以满足性能和功能需求。例如,若需要保留插入顺序且去重,选择 LinkedHashSet;若需要高效随机访问,则选择 ArrayList

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

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

相关文章

【后端面试总结】golang channel深入理解

在Go语言中&#xff0c;Channel是一种用于在goroutine之间进行通信和同步的重要机制。它提供了一种安全、类型安全的方式来传递数据&#xff0c;使得并发编程变得更加直观和简单。本文将详细介绍Golang中Channel的基本概念、创建与关闭、发送与接收操作&#xff0c;以及相关的使…

华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数

华为交换机WEB操作 使用的是真机S5735&#xff0c;目前主流的版本都适用&#xff08;V1R5~V2R1的就不在列了&#xff0c;版本太老了&#xff0c;界面完全不一样&#xff0c;这里调试线接的console口&#xff0c;电脑的网络接在ETH口&#xff09; 「模拟器、工具合集」复制整段内…

详解Java数据库编程之JDBC

目录 首先创建一个Java项目 在Maven中央仓库下载mysql connector的jar包 针对MySQL版本5 针对MySQL版本8 下载之后&#xff0c;在IDEA中创建的项目中建立一个lib目录&#xff0c;然后把刚刚下载好的jar包拷贝进去&#xff0c;然后右键刚刚添加的jar包&#xff0c;点击‘添…

网络(TCP)

目录 TCP socket API 详解 套接字有哪些类型&#xff1f;socket有哪些类型&#xff1f; 图解TCP四次握手断开连接 图解TCP数据报结构以及三次握手&#xff08;非常详细&#xff09; socket缓冲区以及阻塞模式详解 再谈UDP和TCP bind(): 我们的程序中对myaddr参数是这样…

【笔记】离散数学 1-3 章

1. 数理逻辑 1.1 命题逻辑的基本概念 1.1.1 命题的概念 命题&#xff08;Proposition&#xff09;&#xff1a;是一个陈述句&#xff0c;它要么是真的&#xff08;true&#xff09;&#xff0c;要么是假的&#xff08;false&#xff09;&#xff0c;但不能同时为真和假。例如…

【Linux篇】权限管理 - 用户与组权限详解

一. 什么是权限&#xff1f; 首先权限是限制人的。人 真实的人 身份角色 权限 角色 事物属性 二. 认识人–用户 Linux下的用户分为超级用户和普通用户 root :超级管理员&#xff0c;几乎不受权限的约束普通用户 :受权限的约束超级用户的命令提示符是#&#xff0c;普通用…

【机器学习】机器学习的基本分类-监督学习-决策树-C4.5 算法

C4.5 是由 Ross Quinlan 提出的决策树算法&#xff0c;是对 ID3 算法的改进版本。它在 ID3 的基础上&#xff0c;解决了以下问题&#xff1a; 处理连续型数据&#xff1a;支持连续型特征&#xff0c;能够通过划分点将连续特征离散化。处理缺失值&#xff1a;能够在特征值缺失的…

2023年MathorCup高校数学建模挑战赛—大数据竞赛B题电商零售商家需求预测及库存优化问题求解全过程文档及程序

2023年MathorCup高校数学建模挑战赛—大数据竞赛 B题 电商零售商家需求预测及库存优化问题 原题再现&#xff1a; 电商平台存在着上千个商家&#xff0c;他们会将商品货物放在电商配套的仓库&#xff0c;电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策&…

cocotb pytest

打印python中的print &#xff0c; 应该使用 pytest -s pytest --junitxmltest_report.xml --htmlreport.html

【Linux】进程间关系与守护进程

&#x1f30e;进程间关系与守护进程 文章目录&#xff1a; 进程间关系与守护进程 进程组     会话       认识会话       会话ID       创建会话 控制终端     作业控制       作业(job)和作业控制(Job Control)       作业号及作业过程…

QT5.14 QML串口助手

基于 QML的 串口调试助手 这个代码有缺失&#xff0c;补了部分代码 ASCII HEX 工程共享&#xff0c; Qt版本 5.14.1 COM_QML 通过百度网盘分享的文件&#xff1a;COM_QML.zip 链接&#xff1a;https://pan.baidu.com/s/1MH2d6gIPDSoaX-syVWZsww?pwd5tge 提取码&#xff1a;…

IOS ARKit进行图像识别

先讲一下基础控涧&#xff0c;资源的话可以留言&#xff0c;抽空我把它传到GitHub上&#xff0c;这里没写收积分&#xff0c;竟然充值才能下载&#xff0c;我下载也要充值&#xff0c;牛&#xff01; ARSCNView 可以理解画布或者场景 1 配置 ARWorldTrackingConfiguration AR追…

C语言第十五周课——课堂练习

目录 1.输出特定图形 2.求三个数的最小值 3.思考题 1.输出特定图形 要求&#xff1a;输出下面形状在控制台 * * * * * * * * * * * * * * * #include <stdio.h> int main() {int i, j;// 外层循环控制行数for (i 1; i < 5; i){// 内层循环控制每行的星号个数for (…

数据结构 (20)二叉树的遍历与线索化

一、二叉树的遍历 遍历是对树的一种最基本的运算&#xff0c;所谓遍历二叉树&#xff0c;就是按一定的规则和顺序走遍二叉树的所有节点&#xff0c;使每一个节点都被访问一次&#xff0c;而且只被访问一次。二叉树的遍历方式主要有四种&#xff1a;前序遍历、中序遍历、后序遍历…

sscanf与sprintf函数

本期介绍&#x1f356; 主要介绍&#xff1a;sscanf()、sprintf()这对输入/输出函数&#xff0c;并详细讲解了这两个函数的应用场景。 概述&#x1f356; 在C语言的输出和输入库中&#xff0c;有三对及其相似的库函数&#xff1a;printf()、scanf()、fprintf()、fscanf()、spri…

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题&#xff0c;避免了多线程对同一块临界资源访问产生的冲突&#xff0c;但同一时刻对临界资源的访问&#xff0c;不论是生产者还是消费者&#xff0c;都需要竞争互斥锁&#xff0c;由此也带来了竞争的问题。即生产者和消费者、消费…

【错误记录】jupyter notebook打开后服务器错误Forbidden问题

如题&#xff0c;在Anaconda Prompt里输入jupyter notebook后可以打开浏览器&#xff0c;但打开具体项目后就会显示“服务器错误&#xff1a;Forbidden”&#xff0c;终端出现&#xff1a; tornado.web.HTTPError: HTTP 403: Forbidden 查看jupyter-server和jupyter notebook版…

shodan2-批量查找CVE-2019-0708漏洞

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

PostgreSQL实现透视表查询

PostgreSQL 8.3版本发布时&#xff0c;引入了一个名为tablefunc的新扩展。这个扩展提供了一组非常有趣的函数。其中之一是交叉表函数&#xff0c;用于创建数据透视表。这就是我们将在本文中讨论的内容。 需求说明 解释此函数如何工作的最简单方法是使用带有数据透视表的示例…

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载&#xff0c;已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd&#xff0c;键入rustc --version&#xff0c;出现 rust 版本号&…