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;以及相关的使…

java使用HttpClient发送数据的几种情况

1.发送Http 携带 json格式的数据 import org.apache.commons.compress.utils.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org…

稳定运行的以Azure Synapse Dedicated SQL Pool数据仓库为数据源和目标的ETL性能变差时提高性能方法和步骤

在Azure Synapse Dedicated SQL Pool&#xff08;以前称为SQL Data Warehouse&#xff09;的ETL性能变差时&#xff0c;可以通过以下方法和步骤来提高性能&#xff1a; 1. 分析和监控性能瓶颈 查看执行计划&#xff1a;使用SQL的SET STATISTICS IO ON和SET STATISTICS TIME O…

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

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

OpenCL介绍

OpenCL&#xff08;Open Computing Language&#xff09;详解 OpenCL 是一个开源的框架&#xff0c;用于编写在异构平台&#xff08;包括中央处理单元&#xff08;CPU&#xff09;、图形处理单元&#xff08;GPU&#xff09;、数字信号处理器&#xff08;DSP&#xff09;和其他…

项目搭建:springboot,mybatis, maven

创建一个基于Spring Boot、MyBatis和Maven的项目可以简化很多配置&#xff0c;因为Spring Boot自带了很多自动配置的功能。下面我将给出一个简单的示例来展示如何搭建这样一个项目。 ### 1. 创建一个新的Spring Boot项目 你可以通过Spring Initializr&#xff08;https://sta…

详解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;能够在特征值缺失的…

运维之网络安全抓包—— WireShark 和 tcpdump

为什么要抓包&#xff1f;何为抓包&#xff1f; 抓包&#xff08;packet capture&#xff09;就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&#xff0c;也用来检查网络安全。抓包也经常被用来进行数据截取等。为什么要抓包&#xff1f;因为在处理 IP网络…

MongoDB 索引类型详解

MongoDB 索引类型详解 在 MongoDB 中&#xff0c;索引是提高查询效率、优化数据库性能的重要手段。MongoDB 支持多种类型的索引&#xff0c;每种索引类型适用于不同的查询需求和场景。本文将详细介绍 MongoDB 中几种常见的索引类型、示例及其限制。 1. 单字段索引&#xff08…

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)       作业号及作业过程…

RuoYi-Vue部署到Linux服务器(Jar+Nginx)

一、本地环境准备 源码下载、本地Jdk及Node.js环境安装,参考以下文章。 附:RuoYi-Vue下载与运行 二、服务器环境准备 1.安装Jdk 附:JDK8下载安装与配置环境变量(linux) 2.安装MySQL 附:MySQL8免安装版下载安装与配置(linux) 3.安装Redis 附:Redis下载安装与配置(…

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追…

常用排查工具使用

1.spy++ Microsoft Spy++是一个非常好的查看Windows操作系统的窗口、消息、进程、线程信息的工具,简单易用,功能强大。 在vs的工具中默认安装,还可以监控到隐层窗口,通过查看窗口的属性可以获得更多信息,包括规格、窗口、类、进程等信息,可以帮助排查相关窗口的问题。 2…