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

Java中List、Set、Map的区别和实现方式

Java中List、Set、Map的区别和实现方式

List

  • List 是一个有序的集合,即元素按照插入的顺序进行排序,可以有重复的元素。
  • 因为是有序的,所以可以根据下标来获取元素或者遍历整个集合内的元素。
  • 常用的实现类包括 ArrayList 和 LinkedList。

ArrayList

  • 底层是基于数组实现的,在内部维护了一个 Object[] 数组。
  • 当需要添加元素时,首先检查数组是否已满,如果未满,就直接在后面添加元素,否则需要通过扩容数组的方式来增加容量。
  • 由于数组长度固定且数组内的元素是连续的,因此查询某个元素的时间复杂度为 O(1),而添加或删除元素的时间复杂度为 O(n)(需要移动后面的元素)。

LinkedList

  • 底层是基于链表实现的,每个节点包含一个元素和指向下一个节点的引用。
  • 当需要添加(尾部添加O(1))或删除(删除头结点或者使用 iterator 的 remove 方法 O(1))元素时,只需要修改相邻节点之间的引用,不需要对其他元素进行移动。这使得 LinkedList 在添加或删除元素方面比 ArrayList 更快。
  • 由于没有连续的内存,并且需要遍历整个链表才能找到指定元素,因此查询某个元素的时间复杂度为 O(n),而添加或删除元素的时间复杂度为 O(1)。

Set

  • Set 是一个不允许有重复元素的集合,元素没有特定的顺序。
  • 可以用来判断某个元素是否在集合¥¥现过。
  • 常用的实现类包括 HashSet 和 TreeSet。

HashSet

  • 底层是基于 HashMap 来实现的,内部维护了一个 HashMap 实例作为其成员变量。
  • 添加元素时,将元素作为 key 存储在 HashMap 中,value 为一个固定的常量对象。
  • 由于 HashMap 底层使用了哈希表,因此可以快速查找某个元素是否已存在集合中,时间复杂度为 O(1)。
  • 不保证遍历顺序,也不保证插入顺序。

TreeSet

  • 底层是基于红黑树实现的,每个元素都必须实现 Comparable 接口或向构造函数传递一个 Comparator 对象。
  • 每个节点对应一个元素,且每个节点具有以下性质:
    • 如果一个节点有左子节点,则左子节点上的所有元素都比该节点上的元素小;
    • 如果一个节点有右子节点,则右子节点上的所有元素都比该节点上的元素大;
    • 左右子树自身都是一棵二叉搜索树。
  • 由于 TreeSet 底层采用了红黑树,因此平均情况下添加元素、删除元素、查找元素的时间复杂度都为 O(logn)。
  • 确保元素按升序排列,或者在创建时通过传递 Comparator 实例来自定义排序方式。

Map

  • Map 是一个键值对映射的集合,允许键和值都可以为 null,但键不能重复,值可以重复。
  • 可以用于存储一些关联性比较强的数据对象,例如电话簿、字典等。
  • 常用的实现类包括 HashMap 和 TreeMap。

HashMap

  • 底层也是基于哈希表来实现的,内部维护了一个数组,每个元素都是一个链表或树的首节点,用于解决哈希冲突。
  • 添加元素时,会根据 key 的 hash 值进行散列,然后找到对应的数组位置,如果该位置上已经存在元素,则以链表或树结构的形式将其插入。
  • HashMap 可以快速查找某个 key 对应的 value 是否存在集合中,时间复杂度为 O(1)(如果哈希函数设计得好)。
  • 遍历顺序和插入顺序都不保证。

TreeMap

  • 底层是基于红黑树实现的,每个键值对都被封装成一个 Entry 对象,按照键的自然顺序或指定 Comparator 排序。
  • TreeMap 中的所有元素都保证按照排序规则排列,在遍历 TreeMap 时可以获得有序的键值对列表。
  • 添加、删除、查找元素的时间复杂度都为 O(logn),其中 n 表示元素个数。
  • TreeMap 可以自定义排序方式,并且支持限制只允许包含实现了 Comparable 接口的键类型。

总结

List

List是Java集合框架中最基本和最常用的一种数据结构,它是有序集合,可以允许重复的元素。List提供了按照索引来插入、删除和获取指定位置上的元素等操作。

Java中List有很多实现类,比较常用的有:

  • ArrayList:基于数组实现,以及动态扩容。
  • LinkedList:基于链表实现,适合于频繁添加、删除元素操作。

Set

Set也是Java集合框架中的一种数据结构,它是由不同元素组合而成的无序集合,不允许有重复元素。Set的主要目的是为了消除重复元素。

Java中Set的实现类有:

  • HashSet:基于哈希表实现,可快速判断对象的唯一性。
  • TreeSet:基于红黑树实现,可以对元素排序并保证元素唯一性。
  • LinkedHashSet:基于哈希表和链表实现,保留插入时顺序并保证元素唯一性。

Map

Map也是Java集合框架中最常用的一种数据结构,它是由键值对组成的集合,每个键只能出现一次,而且每个键只能映射到一个值。

Java中Map有很多实现类,比较常用的有:

  • HashMap:基于哈希表实现,以键值对的形式进行存储和访问。
  • TreeMap:基于红黑树实现,可以对键进行排序并保证键的唯一性。
  • LinkedHashMap:基于哈希表和链表实现,按照插入顺序维护元素的次序。

相关文章:

Java中List、Set、Map的区别和实现方式

Java中List、Set、Map的区别和实现方式 List List 是一个有序的集合,即元素按照插入的顺序进行排序,可以有重复的元素。因为是有序的,所以可以根据下标来获取元素或者遍历整个集合内的元素。常用的实现类包括 ArrayList 和 LinkedList。 A…...

@EnableScheduling和@Scheduled注解详解fixedrate和fixeddelay的区别

一、pom.xml中导入必要的依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent><dependencies><…...

打印金字塔图案总结

那么好了好了&#xff0c;宝子们&#xff0c;今天给大家总结一下“打印金字塔图案”&#xff0c;来吧&#xff0c;开始整活&#xff01;⛳️ 最近在牛客网上刷题&#xff0c;遇到了这个打印类型的题目&#xff0c;我想总结一下&#xff0c;然后分享给大家。 一、正向金字塔 …...

SQL语句的执行顺序

1、SQL语句的一般执行顺序 1 from 找表 2 on 关联条件帅选 3 join 关联表操作 4 where 条件筛选 5 group by 进行分组 6 avg,sum… 执行函数 7 having 分组后筛选 8 select …...

Debian 版本代号与《玩具总动员》

作为最受欢迎的 Linux 发行版之一&#xff0c;Debian 是许多其他发行版的基础&#xff0c;许多非常受欢迎的 Linux 发行版&#xff0c;例如 Ubuntu、Knoppix、PureOS 、Tails、Armbian 以及 Raspbian&#xff0c;都基于 Debian。 经过近 20 个月的开发&#xff0c;2023 年 6 月…...

TypeScript 第一章

欢迎来到 TypeScript 学习&#xff01;本章将为您介绍 TypeScript 的基础知识。 TypeScript 是 JavaScript 的一个超集&#xff0c;它提供了静态类型检查、类、接口等特性&#xff0c;使得编写大型应用程序变得更加容易和可维护。TypeScript 编写的代码可以被编译成 JavaScript…...

【SpringCloud入门】-- Ribbon入门

1.什么是Ribbon&#xff1f; Ribbon就是netflix公司的一个开源项目&#xff0c;主要功能是提供客户端负载均衡算法和服务调用。Ribbon客户端组件提供了完善的配置项&#xff0c;如连接超时&#xff0c;重试等等。Ribbon作为服务消费者的负载均衡器&#xff0c;有两种使用方式&…...

(二)Liunx下ElasticSearch快速搭建

1.下载安装 1&#xff09;环境准备&#xff1a; 操作系统&#xff1a;centos7 es版本&#xff1a;8.8.1 jdk:17 es与jdk等兼容支持查看 2&#xff09;下载安装包上传到服务器&#xff0c;官网地址 https://www.elastic.co/cn/downloads/elasticsearch 3&#xff09;解压文件…...

神经网络编程基础

目录 1、二分类(Binary Classification) 2、逻辑回归(Logistic Regression) 3、逻辑回归的代价函数&#xff08;Logistic Regression Cost Function&#xff09; 4、梯度下降法&#xff08;Gradient Descent&#xff09; 5、使用计算图求导数 6、逻辑回归中的梯度下降&…...

2023年北京/上海/深圳DAMA-CDGA/CDGP数据治理工程师认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…...

Python之枚举类Enum定义错误码

在 ​​web​​​ 项目中&#xff0c;我们经常使用自定义状态码来告知请求方请求结果以及请求状态&#xff1b;在 ​​Python​​ 中该如何设计自定义的状态码信息呢&#xff1f; 1、普通类字典设计状态码 class RETCODE:OK "0"ERROR …...

GIS大数据处理框架sedona(塞多纳)编程入门指导

GIS大数据处理框架sedona(塞多纳)编程入门指导 简介 Apache Sedona™是一个用于处理大规模空间数据的集群计算系统。Sedona扩展了现有的集群计算系统&#xff0c;如Apache Spark和Apache Flink&#xff0c;使用一组开箱即用的分布式空间数据集和空间SQL&#xff0c;可以有效地…...

C++基础(7)——类和对象(5)

前言 本文主要介绍C中的继承 4.6.1&#xff1a;继承和继承方式&#xff08;公有、保护、私有&#xff09; 4.6.2&#xff1a;继承中的对象模型&#xff0c;sizeof()求子类对象大小 4.6.3&#xff1a;子类继承父类后&#xff0c;两者构造和析构顺序 父类先构造、子类先析构 如…...

【Express.js】sql-knex 增删改查

Sql增删改查 本节使用knex作为sql框架&#xff0c;以sqlite数据库为例 准备工作 knex是一个运行在各自数据库Driver上的框架&#xff0c;因此需要安装相应的js版数据库Driver&#xff0c;如: PostgreSQL -> pg, mysql/mariadb -> mysql, sqlite -> sqlite3… 安装…...

构建基于前后端分离的医学影像学学习平台:Java技术实现与深度解析

在医学领域,影像学学习平台是一种重要的工具,用于帮助医学学生和专业人士学习和研究医学影像。本文将介绍如何使用Java构建一个基于前后端分离的医学影像学学习平台,通过结合前沿的Web开发技术和医学影像处理算法,为用户提供强大且高效的学习工具。 技术架构设计: 在构…...

从零开始学习R语言编程:完全指南

一、引言 R语言是一种流行的数据分析语言&#xff0c;广泛应用于学术界、商业界和社会科学研究等领域。与其它数据分析软件相比&#xff0c;R语言的优点包括免费开源、高效可靠、具有强大的数据分析和可视化能力等。R语言的编程基础包括了各种控制结构和函数&#xff0c;可以方…...

PulsarMQ系列入门篇

文章目录 介绍&#xff1a;部署安装讲解:安装单机版本测试&#xff08;Linux下&#xff09;&#xff1a; 介绍&#xff1a; PulsarMQ 现托管于apache Apache 软件基金会顶级项目&#xff0c;2016年由雅虎公司开源的分布式多租户消息中间件 &#xff0c;是下一代云原生分布式消息…...

编程的实践理论 第九章 交互

第九章 交互 根据状态的初始值和终止值&#xff0c;我们已经描述了计算。一个状态变量的声明如下&#xff1a; var x: T S ∃x, x′: T S 它说的是一个状态变量有两个数学变量&#xff0c;一个是初始值&#xff0c;一个是终止值。在这个 声明的作用域内&#xff0c;x和x…...

BSN全球技术创新发展峰会在武汉举办,“延安链”正式发布

原标题&#xff1a;《第二届BSN全球技术创新发展峰会在武汉成功举行》 6月9日&#xff0c;由湖北省人民政府指导&#xff0c;湖北省发展改革委、国家信息中心联合主办&#xff0c;中国移动、中国电信、中国联通、武汉市江汉区人民政府、区块链服务网络&#xff08;BSN&#xf…...

8.4 IP地址与端口号

目录 IP地址 IP地址及编址方式 IP 地址及其表示方法 点分十进制记法举例 IP 地址采用 2 级结构 分类的 IP 地址 分类的 IP 地址 多归属主机 各类 IP 地址的指派范围 ​编辑 一般不使用的特殊的 IP 地址 ​编辑 分类的 IP 地址的优点和缺点 划分子网 无分类编址 CIDR 无…...

【灶台导航】 RAG系统的容错设计:从向量搜索到关键词降级,一个都不能少

当三个外部依赖都可能随时挂掉时&#xff0c;如何保证用户永远有响应&#xff1f;问题&#xff1a;完美主义害死人 做RAG系统时&#xff0c;我们很容易陷入一种思维定势&#xff1a;向量检索要准、LLM要强、整个链路要丝滑。但现实是——任何一个外部服务挂了&#xff0c;用户就…...

AI产品经理 VS 传统产品经理:不是技术升级,而是物种进化!你准备好了吗?

文章指出&#xff0c;AI时代的产品经理并非仅仅是懂点AI技术的传统产品经理升级版&#xff0c;而是完全不同的“物种”。文章从产品经理的职责、核心能力、与AI的协作模式等方面对比了传统产品经理和AI产品经理的区别&#xff0c;强调AI产品经理需要具备处理意图模糊性、设计失…...

AI编码助手重复犯错?4大策略构建可控的智能编程伙伴

1. 项目概述&#xff1a;当AI编码助手陷入“重复犯错”的怪圈最近和几个团队的技术负责人聊天&#xff0c;发现大家都有个共同的烦恼&#xff1a;项目里引入的AI编码助手&#xff08;或者叫AI编程副驾&#xff09;&#xff0c;用着用着就发现它好像“不长记性”。同一个项目里&…...

传统RAG把文档切碎,TreeSearch不接受,结果反而更快更准

无需 Embedding&#xff0c;无需向量库&#xff0c;无需切分——开源项目TreeSearch 用树结构保留文档灵魂&#xff0c;毫秒级检索万级文档。 你是不是也被 RAG 切碎过&#xff1f; 用过 RAG 的人都知道这个痛点&#xff1a; 文档被机械地切成固定大小的 chunk&#xff0c;喂…...

Go语言轻量级Web框架Tapestry:高性能路由与中间件设计实战

1. 项目概述与核心价值最近在开源社区里&#xff0c;一个名为Tapestry的项目引起了我的注意。它来自开发者 NatsuFox&#xff0c;定位是一个“轻量级、高性能的 Web 框架”。说实话&#xff0c;现在各种语言的 Web 框架多如牛毛&#xff0c;从 Python 的 Flask、Django&#xf…...

PHP批量导出数据,CSV格式文件 - 支持几十万行数据无压力

目录 一、前言 二、解决方案 三、示例 一、前言 之前做数据批量导出一直都是用的PHPExcel插件&#xff0c;一个是由于现在PHPExcel已经不再维护了&#xff0c;一个是如果导出大批量数据&#xff0c;导出的表格就会提示数据损坏、文件不完整之类的提示&#xff0c;就是打不开…...

Windows删除文件权限问题解决

首先&#xff0c;强制删除的文件将不经过回收站。方法一&#xff1a;可视化获取权限如果文件不是被系统占用&#xff0c;可以直接在文件属性中抢夺控制权。获取所有权&#xff1a;右键点击该文件/文件夹&#xff0c;选择 属性 → 安全 → 高级-。在打开的窗口中&#xff0c;点击…...

MCP密钥安全管理的无侵入解决方案:mcp-safe-run工具详解

1. 项目概述&#xff1a;告别硬编码&#xff0c;拥抱安全的MCP密钥管理如果你和我一样&#xff0c;日常开发中深度依赖Claude、Cursor、Windsurf这类智能编码助手&#xff0c;那你肯定对Model Context Protocol&#xff08;MCP&#xff09;不陌生。MCP作为连接AI模型与外部工具…...

IP2366至为芯支持C口双向快充的140W多串锂电池充放电SOC芯片

英集芯IP2366是一款应用于移动电源、电动工具、智能家居、储能电源等方案的多串锂电池充电SOC芯片。支持高达140W的双向同步升降压充放电&#xff0c;充电电流可达5A。支持2至6节锂电池/磷酸铁锂电池串联&#xff0c;集成PD3.1、QC3.0等多种快充协议。内置14bit ADC&#xff0c…...

Docker 部署 XiuXianGame 文字修仙游戏:极空间 NAS 上随时挂机刷资源

前言 挂机刷资源&#xff0c;躺平修成仙。 这类文字修仙游戏&#xff0c;说白了就是佛系养成为主&#xff0c;不用时刻盯着&#xff0c;挂着就行。但问题是——大多数要么得在本地电脑跑&#xff0c;要么依赖第三方平台&#xff0c;体验受限。把这套东西跑在自己的 NAS 上&am…...