java中的List、数组和set
在Java中,List、数组(Array)和Set 是三种常用的数据结构,它们各自有不同的特性、用途和实现方式。下面我们将深入探讨这三者的特点、区别以及它们在 Java 中的常见使用场景。
1. 数组(Array)
特性:
- 固定大小:数组在声明时必须指定其大小,且一旦创建,大小就不可改变。
- 元素类型统一:数组中的所有元素必须是同一种类型(可以是基本数据类型或对象类型)。
- 直接访问:数组允许通过索引快速访问元素,时间复杂度为O(1)。
- 低开销:数组本身是一个轻量级的数据结构,相对于
List
或Set
,它不需要额外的管理开销。
数组的创建和访问:
public class ArrayExample {public static void main(String[] args) {// 创建一个整数数组int[] array = new int[5]; // 数组长度为5array[0] = 10; // 设置第一个元素的值为 10array[1] = 20; // 设置第二个元素的值为 20// 访问数组元素System.out.println("First element: " + array[0]); // 输出 10System.out.println("Second element: " + array[1]); // 输出 20}
}
数组的优缺点:
- 优点:
- 访问速度快,能够通过索引直接访问元素。
- 存储结构简单,适用于知道元素个数并且元素个数不会发生变化的场景。 - 缺点:
- 固定大小,不能动态调整。
- 对于需要频繁添加或删除元素的场景,效率较低。
- 类型安全性较差(对于基本数据类型)。
适用场景:
- 存储固定大小的数据集,如存储一周的7天数据。
- 需要通过索引进行频繁访问的场景。
2. List
特性:
- 动态大小:与数组不同,
List
是动态扩展的容器,元素数量可以增加或减少。 - 有序:
List
中的元素是有序的,且元素可以重复。 - 实现接口:
List
是一个接口,在 Java 中有多个实现类,如ArrayList
、LinkedList
和Vector
。 - 元素访问:提供通过索引访问元素的能力。
创建 List
和基本操作:
import java.util.List;
import java.util.ArrayList;public class ListExample {public static void main(String[] args) {// 创建一个ArrayListList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Cherry");// 通过索引访问元素System.out.println("First element: " + list.get(0)); // 输出 AppleSystem.out.println("Second element: " + list.get(1)); // 输出 Banana// 遍历Listfor (String fruit : list) {System.out.println(fruit);}// 检查List大小System.out.println("List size: " + list.size()); // 输出 3}
}
List
的优缺点:
- 优点:
- 动态扩展,可以随时添加或删除元素。
- 保持元素的插入顺序。
- 支持通过索引访问元素,类似于数组。
- 提供多种实现,如ArrayList
和LinkedList
,可以根据不同的场景选择合适的实现。 - 缺点:
- 对于大量数据的频繁插入和删除操作,某些实现(如ArrayList
)的效率较低,因为插入删除操作可能涉及数组的移动。
- 与数组相比,List
通常有更多的开销,尤其是对于LinkedList
类型的实现。
适用场景:
- 当需要频繁访问、修改或删除元素时,
List
是一个更灵活的选择。 - 需要保持插入顺序或允许重复元素的场景。
3. Set
特性:
- 无序:
Set
是一个集合,它不保证元素的顺序。 - 不允许重复:
Set
中的元素是唯一的,重复元素会被自动去重。 - 常见实现类:
HashSet
、LinkedHashSet
、TreeSet
。
-HashSet
:不保证元素顺序,基于哈希表实现。
-LinkedHashSet
:维护插入顺序,基于链表和哈希表实现。
-TreeSet
:元素会按照自然顺序或自定义顺序排序。
创建 Set
和基本操作:
import java.util.Set;
import java.util.HashSet;public class SetExample {public static void main(String[] args) {// 创建一个HashSetSet<String> set = new HashSet<>();set.add("Apple");set.add("Banana");set.add("Cherry");set.add("Apple"); // 重复元素// 输出集合内容for (String fruit : set) {System.out.println(fruit);}// 检查集合大小System.out.println("Set size: " + set.size()); // 输出 3,因为重复元素被去除了}
}
Set
的优缺点:
- 优点:
- 不允许重复元素,适用于需要保证唯一性的场景。
- 由于Set
不保证顺序,它可以提供更高效的查找操作,特别是在使用HashSet
时,查找、插入和删除的时间复杂度为 O(1)。 - 缺点:
- 不支持元素的索引访问,不能通过索引直接访问元素。
- 元素是无序的,无法保证插入的顺序(但LinkedHashSet
和TreeSet
提供了不同程度的顺序保证)。
适用场景:
- 需要确保集合中元素唯一且不关心顺序的场景。
- 查找、插入和删除操作比较频繁的情况。
总结:List、数组和Set的区别
特性 | 数组 (Array) | List | Set |
---|---|---|---|
大小 | 固定大小 | 动态大小(可以改变大小) | 动态大小(元素唯一) |
元素类型 | 可以是基本数据类型或对象类型 | 可以是对象类型(泛型支持) | 只能包含唯一元素 |
元素访问 | 通过索引访问(O(1)) | 通过索引访问(ArrayList) | 不支持索引访问 |
顺序 | 固定顺序(按索引顺序) | 保持插入顺序(有序) | 无序(TreeSet 可以排序) |
重复元素 | 可以有重复元素 | 允许重复元素 | 不允许重复元素 |
实现 | 基本数组类型 | ArrayList , LinkedList 等 | HashSet , LinkedHashSet , TreeSet |
使用场景:
- 数组:适用于元素数量固定且频繁访问的场景。
- List:适用于需要动态大小、顺序和可以重复元素的场景,且需要索引访问。
- Set:适用于需要唯一性且不关心顺序的场景,或者需要去重的情况。
通过理解这三种数据结构的不同特点,你可以根据实际的业务需求选择合适的数据结构来提高程序的效率和可维护性。
相关文章:

java中的List、数组和set
在Java中,List、数组(Array)和Set 是三种常用的数据结构,它们各自有不同的特性、用途和实现方式。下面我们将深入探讨这三者的特点、区别以及它们在 Java 中的常见使用场景。 1. 数组(Array) 特性&#x…...

freeswitch(配置文件结构)
vars.xml<X-PRE-PROCESS cmd="set" data="default_password=1234"/>default_password:设置默认密码,为安全起见,建议在部署后立即更改此密码,以防止盗用。<X-PRE-PROCESS cmd=<...

ARMS 用户体验监控正式发布原生鸿蒙应用 SDK
作者:羿莉 背景 对企业数据进行敏感数据扫描和保护可以提升企业或组织的数据安全。一方面敏感数据可能包括个人身份信息、财务记录、医疗记录等,定期扫描这些数据可以防止未经授权的访问和泄露。 另一方面,许多国家和地区都有关于数据保护的…...

使用 esrally race 测试 Elasticsearch 性能:实践指南
在 Elasticsearch 性能优化和容量规划中,使用 esrally 进行基准测试是官方推荐的方式。通过 esrally race 命令,您可以针对不同的数据集与挑战类型,对 Elasticsearch 集群进行精确的性能评估。本文将简要介绍常用的数据集与挑战类型ÿ…...

OkHttp源码分析:分发器任务调配,拦截器责任链设计,连接池socket复用
目录 一,分发器和拦截器 二,分发器处理异步请求 1.分发器处理入口 2.分发器工作流程 3.分发器中的线程池设计 三,分发器处理同步请求 四,拦截器处理请求 1.责任链设计模式 2.拦截器工作原理 3.OkHttp五大拦截器 一&#…...

中国计算机学会计算机视觉专委会携手合合信息举办企业交流活动,为AI安全治理打开“新思路”
近期,《咬文嚼字》杂志发布了2024年度十大流行语,“智能向善”位列其中,过去一年时间里,深度伪造、AI诈骗等话题屡次登上热搜,AI技术“野蛮生长”引发公众担忧。今年9月,全国网络安全标准化技术委员会发布了…...

重生之我在异世界学编程之C语言:深入预处理篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、预处理的作用与流程…...

dolphinscheduler服务RPC框架源码解析(二)RPC核心注解@RpcService和@RpcMethod设计实现
1.工程目录 从3.2.1版本之后这个dolphinscheduler中的RPC框架工程就从原来的dolphinscheduler-remote工程重构到了dolphinscheduler-extract工程。 dolphinscheduler 父项目 dolphinscheduler-extract RPC服务项目 dolphinscheduler-extract-alert 监控告警服务RPC接口定义、…...

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string
文章目录 知识回顾一、栈(Stack)和堆(Heap)1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢?值类型引用类型 2、总结 三、特殊的引用类…...

ARCGIS国土超级工具集1.2更新说明
ARCGIS国土超级工具集V1.2版本,功能已增加至47 个。在V1.1的基础上修复了若干使用时发现的BUG,新增了"矢量分割工具"菜单,同时增加及更新了了若干功能,新工具使用说明如下: 一、勘测定界工具栏更新界址点成果…...

暂停window11自动更新
window11 的自动更新功能,一方面在后台占用资源,容易导致电脑卡顿;另一方面,“更新并关机” 和 “更新并重启” 的设置令人极其反感。很多补丁兼容性很差,更新后极易引发电脑蓝屏、闪屏等意想不到的 bug。 1.winR打开运…...

Git简介和特点
目录 一、Git简介 二、Git特点 1.集中式和分布式 (1)集中式版本控制系统 (2)分布式版本控制系统 2.版本存储方式的差异 (1)直接记录快照,而非差异比较 3.近乎所有操作都是本地执行 一、Git简介 Git是目前世界上最先进的的分布式控制系统(没有之一…...

如何通过docker 部署minio,端口号为9105
通过Docker部署MinIO对象存储服务,并指定API端口为9105,可以按照以下步骤进行。我们将基于已有的资料来详细说明这一过程。 1. 准备工作 首先,确保你的系统上已经安装了Docker。如果没有安装,可以根据官方文档指导完成安装。接下…...

设置Qt程序开机自启动(windows版本)
前言 本文展示在windows环境下,通过代码实现更改系统注册表的方式来实现程序的开机自动启动。 一、注册表 需要更改的系统注册表为: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run 二、代码演示 1.头文件 头文件autorun.h #ifndef …...

【HarmonyOS】鸿蒙获取appIdentifier,Identifier
【HarmonyOS】鸿蒙获取appIdentifier,Identifier 一、前言 三方后台需要填写的所谓appIdentifier,Identifier信息,其实对应鸿蒙应用的appID。 二、解决方案: 注意,模拟器获取data.signatureInfo.appIndentifer为空…...

【Rust自学】3.5. 控制流:if else
3.5.0. 写在正文之前 欢迎来到Rust自学的第三章,一共有6个小节,分别是: 变量与可变性数据类型:标量类型数据类型:复合类型函数和注释控制流:if else(本文)控制流:循环 通过第二章…...

美国信息学奥林匹克竞赛USACO 2024年12月比赛铜级问题1. 循环舍入-答案代码
题目见: USACO 2024年12月比赛铜级问题1. 循环舍入(USACO 2024 December Contest, Bronze Problem 1. Roundabount Rounding) 最简单的青铜级 亲测所有得分点通过哈! 下一篇会给解题分析哦! #include <iostream> using namespace std;…...

Llama3模型详解 - Meta最新开源大模型全面解析
📚 Meta最新发布的Llama3模型在开源社区引起广泛关注。本文将全面解析Llama3的技术特点、部署要求和应用场景。 一、模型概述 1. 基本信息 发布机构: Meta AI开源协议: Llama 2 Community License Agreement模型规格: 7B/13B/34B/70B训练数据: 2万亿tokens上下文长…...

2021-02-12 c++里面cin.sync()函数的意思
回复急~救救菜鸡吧,C用cin.clear()和cin.sycn()清空缓存区一直清不了!_编程语言-CSDN问答 标识符号为:goodbit 无错误 Eofbit 已到达文件尾 failbit 非致命的输入/输出错误可挽回 badbit 致命的输入/输出错误无法挽回 int a 0;cin >> a;if (cin.rdstate() i…...

下载红米Note 9 Pro5G对应的LineageOS代码下载及编译
构建 LineageOS 进入网站:Info about gauguin | LineageOS Wiki,点击:Build for yourself,里面有详细的教程,我这里就按照Note 9 Pro 5G来。 机器环境 Ubuntu环境为:20.04.6LinagesOS版本:21-…...

《探索 Caffe2 的 C++接口在移动设备上的性能优化之路》
在当今移动应用日益智能化的时代,将深度学习框架如 Caffe2 的 C接口应用于移动设备上已成为众多开发者的目标。然而,移动设备资源相对有限,如何优化其性能成为了关键挑战。 一、移动设备应用深度学习的现状与挑战 随着智能手机等移动设备的…...

1.编写一个程序,给定一个大写字母,要求用小写输出
思路:ascII码值 例如:A的ASCII码值为65,a的ASCII码值为97,不难发现,大小写字母之间的ascii值相差了32 #include <stdio.h> int main() {char c;scanf("%c",&c);printf("%c",c32);retu…...

条件随机场(CRF)详解:原理、算法与实现(深入浅出)
目录 1. 引言2. 什么是条件随机场?2.1 直观理解2.2 形式化定义 3. CRF的核心要素3.1 特征函数3.2 参数学习 4. 实战案例:命名实体识别5. CRF vs HMM6. CRF的优化与改进6.1 特征选择6.2 正则化 7. 总结与展望参考资料 1. 引言 条件随机场(Conditional Ra…...

Android Studio、JDK、AGP、Gradle、kotlin-gradle-plugin 兼容性问题
文章目录 问题:解决办法:gradle与 java的版本兼容AGP与Gradle的版本兼容kotlin 与 jvm 的版本兼容KGP、Gradle、AGP兼容关系kotlin 与 java 的编译版本配置 问题: 你从githb上clone了一个项目,本地跑的时候,各种报错。…...

防抖(Debounce)和节流(Throttle)的区别和应用场景
防抖(Debounce)和节流(Throttle)虽然都是用来限制函数的执行频率,但它们的实现方式和应用场景有所不同。以下是两者的主要区别: 1. 执行原理 防抖(Debounce): 执行条件&a…...

前端 Code Review 常见问题
在前端开发中,代码审查(Code Review)是一个至关重要的步骤。它不仅可以帮助团队成员之间共享知识和经验,还可以提高代码质量,减少错误和安全漏洞。以下是一些常见的前端 Code Review 问题和相应的解决方案。 1. 不一致…...

Python监控AWS ECS集群和服务的CPU和内存利用率
在电子商务或其他行业,重要节日通常会带来大量的流量和订单,这对应用程序的资源利用率提出了更高的要求。为了确保应用程序在节日期间能够顺利运行,提前监控和优化资源利用率至关重要。 在本文中,我们将介绍如何使用Python编写一个脚本,从AWS CloudWatch中获取ECS集群和服务的…...

淘宝天猫API接口深度解析:如何高效利用商品详情与关键词搜索商品列表功能
在电子商务的浩瀚海洋中,淘宝和天猫作为两大巨头,其平台上的商品信息无疑是商家和消费者关注的焦点。为了更高效地获取这些信息,淘宝天猫开放平台提供了丰富的API接口,其中商品详情接口和关键词搜索商品列表接口尤为关键。本文将深…...

python快速接入阿里云百炼大模型
1.注册阿里云账号 访问阿里云官网,完成账号注册流程,并开通百炼服务,网址:https://bailian.console.aliyun.com 2.获取 API Key 登录阿里云百炼平台,在个人中心或相关设置页面找到并生成 API Key,妥善保管此…...

基于AI对话生成剧情AVG游戏
游戏开发这个领域,一直有较高的学习门槛。作为一个非专业的游戏爱好者,如果想要开发游戏,往往受制于游戏引擎的专业程度,难以完成复杂的游戏项目。 AI IDE的诞生,提供了另外的一种思路,即通过AI 生成项目及…...