当前位置: 首页 > 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 无…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...