当前位置: 首页 > news >正文

java中的List、数组和set

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

1. 数组(Array)

特性:

  • 固定大小:数组在声明时必须指定其大小,且一旦创建,大小就不可改变。
  • 元素类型统一:数组中的所有元素必须是同一种类型(可以是基本数据类型或对象类型)。
  • 直接访问:数组允许通过索引快速访问元素,时间复杂度为O(1)。
  • 低开销:数组本身是一个轻量级的数据结构,相对于 ListSet,它不需要额外的管理开销。

数组的创建和访问:

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 中有多个实现类,如 ArrayListLinkedListVector
  • 元素访问:提供通过索引访问元素的能力。

创建 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 的优缺点:

  • 优点
      - 动态扩展,可以随时添加或删除元素。
      - 保持元素的插入顺序。
      - 支持通过索引访问元素,类似于数组。
      - 提供多种实现,如 ArrayListLinkedList,可以根据不同的场景选择合适的实现。
  • 缺点
      - 对于大量数据的频繁插入和删除操作,某些实现(如 ArrayList)的效率较低,因为插入删除操作可能涉及数组的移动。
      - 与数组相比,List 通常有更多的开销,尤其是对于 LinkedList 类型的实现。

适用场景:

  • 当需要频繁访问、修改或删除元素时,List 是一个更灵活的选择。
  • 需要保持插入顺序或允许重复元素的场景。

3. Set

特性:

  • 无序Set 是一个集合,它不保证元素的顺序。
  • 不允许重复Set 中的元素是唯一的,重复元素会被自动去重。
  • 常见实现类HashSetLinkedHashSetTreeSet
      - 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)。
  • 缺点
      - 不支持元素的索引访问,不能通过索引直接访问元素。
      - 元素是无序的,无法保证插入的顺序(但 LinkedHashSetTreeSet 提供了不同程度的顺序保证)。

适用场景:

  • 需要确保集合中元素唯一且不关心顺序的场景。
  • 查找、插入和删除操作比较频繁的情况。

总结:List、数组和Set的区别

特性数组 (Array)ListSet
大小固定大小动态大小(可以改变大小)动态大小(元素唯一)
元素类型可以是基本数据类型或对象类型可以是对象类型(泛型支持)只能包含唯一元素
元素访问通过索引访问(O(1))通过索引访问(ArrayList)不支持索引访问
顺序固定顺序(按索引顺序)保持插入顺序(有序)无序(TreeSet 可以排序)
重复元素可以有重复元素允许重复元素不允许重复元素
实现基本数组类型ArrayList, LinkedListHashSet, LinkedHashSet, TreeSet

使用场景:

  • 数组:适用于元素数量固定且频繁访问的场景。
  • List:适用于需要动态大小、顺序和可以重复元素的场景,且需要索引访问。
  • Set:适用于需要唯一性且不关心顺序的场景,或者需要去重的情况。

通过理解这三种数据结构的不同特点,你可以根据实际的业务需求选择合适的数据结构来提高程序的效率和可维护性。

相关文章:

java中的List、数组和set

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

freeswitch(配置文件结构)

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

ARMS 用户体验监控正式发布原生鸿蒙应用 SDK

作者&#xff1a;羿莉 背景 对企业数据进行敏感数据扫描和保护可以提升企业或组织的数据安全。一方面敏感数据可能包括个人身份信息、财务记录、医疗记录等&#xff0c;定期扫描这些数据可以防止未经授权的访问和泄露。 另一方面&#xff0c;许多国家和地区都有关于数据保护的…...

使用 esrally race 测试 Elasticsearch 性能:实践指南

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

OkHttp源码分析:分发器任务调配,拦截器责任链设计,连接池socket复用

目录 一&#xff0c;分发器和拦截器 二&#xff0c;分发器处理异步请求 1.分发器处理入口 2.分发器工作流程 3.分发器中的线程池设计 三&#xff0c;分发器处理同步请求 四&#xff0c;拦截器处理请求 1.责任链设计模式 2.拦截器工作原理 3.OkHttp五大拦截器 一&#…...

中国计算机学会计算机视觉专委会携手合合信息举办企业交流活动,为AI安全治理打开“新思路”

近期&#xff0c;《咬文嚼字》杂志发布了2024年度十大流行语&#xff0c;“智能向善”位列其中&#xff0c;过去一年时间里&#xff0c;深度伪造、AI诈骗等话题屡次登上热搜&#xff0c;AI技术“野蛮生长”引发公众担忧。今年9月&#xff0c;全国网络安全标准化技术委员会发布了…...

重生之我在异世界学编程之C语言:深入预处理篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、预处理的作用与流程&#xf…...

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

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…...

ARCGIS国土超级工具集1.2更新说明

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

暂停window11自动更新

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

Git简介和特点

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

如何通过docker 部署minio,端口号为9105

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

设置Qt程序开机自启动(windows版本)

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

【HarmonyOS】鸿蒙获取appIdentifier,Identifier

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

【Rust自学】3.5. 控制流:if else

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

美国信息学奥林匹克竞赛USACO 2024年12月比赛铜级问题1. 循环舍入-答案代码

题目见&#xff1a; USACO 2024年12月比赛铜级问题1. 循环舍入(USACO 2024 December Contest, Bronze Problem 1. Roundabount Rounding) 最简单的青铜级 亲测所有得分点通过哈&#xff01; 下一篇会给解题分析哦&#xff01; #include <iostream> using namespace std;…...

Llama3模型详解 - Meta最新开源大模型全面解析

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

2021-02-12 c++里面cin.sync()函数的意思

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

下载红米Note 9 Pro5G对应的LineageOS代码下载及编译

构建 LineageOS 进入网站&#xff1a;Info about gauguin | LineageOS Wiki&#xff0c;点击&#xff1a;Build for yourself&#xff0c;里面有详细的教程&#xff0c;我这里就按照Note 9 Pro 5G来。 机器环境 Ubuntu环境为&#xff1a;20.04.6LinagesOS版本&#xff1a;21-…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...

Python爬虫(四):PyQuery 框架

PyQuery 框架详解与对比 BeautifulSoup 第一部分&#xff1a;PyQuery 框架介绍 1. PyQuery 是什么&#xff1f; PyQuery 是一个 Python 的 HTML/XML 解析库&#xff0c;它采用了 jQuery 的语法风格&#xff0c;让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...