Java集合相关的List、Set、Map基础知识

目录

一、集合介绍

二、List

三、Map

HashMap的数据结构

如何理解红黑树

四、set


一、集合介绍

在Java中,集合是一种用于存储对象的数据结构,它提供了一种更加灵活和强大的方式来处理和操作数据。Java集合框架提供了一系列接口和类,用于表示和操作不同类型的集合

图片来源:《面渣逆袭手册》V1.1

其中 Collection 是集合 List Set 的父接口,它主要有两个子接口:
        List :存储的元素有序,可重复。(相当于是个篮子,临时给你放数据用的
        Set :存储的元素无序,不可重复。(去重的List,放进去的东西如果一样,后面的会把前面的覆盖掉,得到的是个无重复值的列表
        Map 是另外的接口,是键值对映射结构的集合。(Map是个键值对,可以实现用a来搜b的作用,比如用用户的id搜用户的名称之类的操作

以下是Java中常见的集合:

  1. List(列表)

    • ArrayList:基于数组实现的动态数组,支持快速随机访问元素,但插入和删除操作效率较低。
    • LinkedList:基于链表实现的双向列表,插入和删除操作效率较高,但访问元素的效率较低。
    • Vector:与 ArrayList 类似,但是线程安全的,不推荐在新代码中使用。
    • Stack:基于 Vector 实现的栈,通常用于实现后进先出(LIFO)的数据结构。
  2. Set(集合)

    • HashSet:基于哈希表实现的集合,不保证元素的顺序。
    • TreeSet:基于红黑树实现的有序集合,可以按照自然顺序或者自定义顺序对元素进行排序。
    • LinkedHashSet:具有预期插入顺序的集合,内部使用链表维护元素的顺序。
  3. Map(映射)

    • HashMap:基于哈希表实现的映射,键值对无序。
    • TreeMap:基于红黑树实现的有序映射,键值对按照键的自然顺序或者自定义顺序进行排序。
    • LinkedHashMap:具有预期插入顺序的映射,内部使用链表维护键值对的顺序。
  4. Queue(队列)

    • PriorityQueue:基于堆实现的优先级队列,按照元素的优先级顺序进行排序。

此外,Java集合框架还包括一些接口和抽象类,如 CollectionMapIterator 等,它们提供了一组通用的操作和方法,可以方便地对集合进行操作和遍历。

二、List

在 Java 中,ArrayList 和 LinkedList 是两种常见的集合实现,它们有以下主要区别:

  1. 内存分配
    • ArrayList:使用连续的内存空间来存储元素。
    • LinkedList:使用链式存储结构,内存空间不连续,它们在空间占用上都有一些额外的消耗
    • ArrayList 是预先定义好的数组,可能会有空的内存空间,存在一定空间浪费
      LinkedList 每个节点,需要存储前驱和后继,所以每个节点会占用更多的空间
  2. 随机访问
    • ArrayList基于数组,所以它可以根据下标查找,支持快速的随机访问,通过索引可以快速获取元素。
    • LinkedList基于链表,所以它没法根据序号直接获取元素,在随机访问方面效率较低。
  3. 插入和删除
    • 多数情况下,ArrayList更利于查找,LinkedList更利于增删。
    • ArrayList 基于数组实现, get(int index) 可以直接通过数组下标获取,时间复杂度
      O(1) LinkedList 基于链表实现, get(int index) 需要遍历链表,时间复杂度是
      O(n) ;当然, get(E element) 这种查找,两种集合都需要遍历,时间复杂度都是
      O(n)
    • ArrayList增删如果是数组末尾的位置,直接插入或者删除就可以了,但是如果插
      入中间的位置,就需要把插入位置后的元素都向前或者向后移动,甚至还有可能
      触发扩容;双向链表的插入和删除只需要改变前驱节点、后继节点和插入节点的
      指向就行了,不需要移动元素。
    • 图片来源:《面渣逆袭手册》V1.1
  4. 内存占用
    • ArrayList:需要预先分配一定的内存空间,如果元素数量超过容量,需要进行扩容。
      基于数组的集合,数组的容量是在定义的时候确定的,如果数组满了,
      再插入,就会数组溢出。所以在插入时候,会先检查是否需要扩容,如果当前容量
      +1 超过数组长度,就会进行扩容。
    • ArrayList的扩容是创建一个1.5的新数组,然后把原数组的值拷贝过去。
    • LinkedList:不需要预先分配固定的内存空间。
  5. 遍历方式
    • ArrayList:可以通过索引或迭代器进行遍历。
    • LinkedList:还可以通过指针依次访问元素。
      示例代码如下:
    • import java.util.ArrayList;
      import java.util.LinkedList;
      import java.util.List;public class CollectionExample {public static void main(String[] args) {// 使用 ArrayListList<String> arrayList = new ArrayList<>();arrayList.add("Apple");arrayList.add("Banana");arrayList.add("Orange");System.out.println("使用 ArrayList 遍历:");for (String item : arrayList) {System.out.println(item);}// 使用 LinkedListList<String> linkedList = new LinkedList<>();linkedList.add("Apple");linkedList.add("Banana");linkedList.add("Orange");System.out.println("\n 使用 LinkedList 遍历:");for (String item : linkedList) {System.out.println(item);}}
      }

三、Map

在 Java 中,常见的 Map 实现有 HashMap 和 TreeMap 。

HashMap 基于哈希表实现,它的数据结构如下:

  • 存储键值对。
  • 通过哈希函数计算键的哈希值,以确定元素在哈希表中的存储位置。

TreeMap 基于红黑树实现,它的数据结构如下:

  • 按照键的自然顺序进行排序。
  • 提供有序的键值对访问。

HashMap的数据结构

JDK1.8 的数据结构是 数组 + 链表 + 红黑树

数据结构示意图如下:

图片来源:《面渣逆袭手册》V1.1

其中,桶数组是用来存储数据元素,链表是用来解决冲突, 红黑树 是为了提高查询
的效率。
数据元素通过映射关系,也就是散列函数,映射到桶数组对应索引的位置
如果发生冲突,从冲突的位置拉一个链表,插入冲突的元素
如果链表长度  > 8 &  数组大小  >= 64  ,链表转为红黑树
如果红黑树节点个数  < 6 ,转为链表

哈希表的基本原理是通过哈希函数将键映射到特定的存储位置,以实现快速的插入、查找和删除操作。


哈希函数用于计算键的哈希值,并根据哈希值确定元素在哈希表中的存储位置。哈希表通常包含以下组件:

  1. 数组:用于存储元素。
  2. 哈希函数:将键转换为数组的索引。
  3. 冲突处理机制:处理不同键可能映射到相同索引的冲突。

在插入元素时,通过哈希函数计算键的哈希值,确定存储位置。如果该位置为空,则直接插入元素;如果存在冲突,使用冲突处理机制解决。

在查找元素时,同样通过哈希函数计算哈希值,找到对应的位置进行查找。

哈希表的优点包括:

  1. 快速的插入、查找和删除操作。
  2. 不需要按照特定顺序存储元素。

如何理解红黑树

红黑树本质上是一种二叉查找树,为了保持平衡,它又在二叉查找树的基础上增加了一些规则:
  1. 颜色规则:每个节点要么是红色,要么是黑色
  2. 特性规则:
    • 根节点是黑色的。
    • 如果一个节点是红色的,那么它的子节点必须是黑色的。
    • 从每个叶子节点到根节点的所有路径上,黑色节点的数量相同。
      在进行插入或删除操作时,红黑树会通过一系列的旋转和颜色调整来保持这些规则,以确保树的平衡性。

图片来源:《面渣逆袭手册》V1.1

旋转操作包括左旋和右旋,用于调整树的结构。

红黑树有两种方式保持平衡: 旋转 染色 通过保持红黑树的平衡性,可以提高搜索、插入和删除操作的效率,避免出现最坏情况下的线性搜索。

有关HashMap的知识点非常多,这里不做详述,后面会单独写一篇有关HashMap的相关内容。

哈希表在以下场景中比较适用:

  1. 快速查找:当需要快速查找数据时,哈希表可以提供高效的查找性能。
  2. 存储和检索数据:适用于需要频繁地插入、删除和查找数据的场景。
  3. 缓存:可以用于缓存数据,以提高系统的性能。
  4. 统计频率:用于统计元素的出现频率。
  5. 数据去重:去除重复的数据。
  6. 关联数据:建立键值对的关联。
    例如,在以下场景中可能会使用哈希表:
  7. 数据库索引:加速数据的查询。
  8. 缓存系统:提高数据的访问速度。
  9. 网页搜索引擎:快速检索和索引网页。
  10. 数据处理和分析:高效地处理大量数据。

四、set

HashSet 是 Java 中的一个集合类,它不允许存储重复的元素。HashSet 底层就是基于 HashMap 实现的。( HashSet 的源码⾮常⾮常少,因为除了 clone() 、 writeObject() 、 readObject() 是 HashSet⾃⼰不得不实现之外,其他⽅法都是直接调⽤ HashMap 中的⽅法。

HashSet的add方法,直接调用HashMap的put方法,将添加的元素作为key,new一个 Object作为value,直接调用HashMap的put方法,它会根据返回值是否为空来判断是否插入元素成功。

以下是 HashSet 的一些特点:

  1. 无序性:元素的存储顺序是无序的。
  2. 不允许重复元素:确保每个元素在集合中唯一。
  3. 基于哈希表实现:提供快速的插入、查找和删除操作。

参考

《面渣逆袭手册》V1.1.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pointnet++改进即插即用系列:全网首发PPA反向残差移动块 |即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入PPA,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三

Transformer模型详解01-Word Embedding

文章目录 前言Transformer 整体结构Transformer 的输入单词 Embedding原理CBOW 模型one-hot构建 CBOW 训练数据集构建 CBOW 神经网络训练 CBOW 神经网络 Skip-gram 模型one-hot构建 Skip-gram训练数据集训练 Skip-gram神经网络 Word2Vec实例数据训练保存和加载 前言 Transform…

【上岗认证】错题整理记录

目录 &#x1f31e;一、阶段1&#xff1a;编码规范 &#x1f30a;编码规范考试-CC &#x1f31e;二、阶段2&#xff1a;开发基础 &#x1f30a;C/C &#x1f30a;数据库&#xff08;Oracle/MySql&#xff09; &#x1f31e;三、阶段3&#xff1a;测试基础 &#x1f30a;…

Springboot+Vue项目-基于Java+MySQL的家政服务平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

实时数仓选型

实时数仓选型 实时数仓选型第一版实时数仓选型第二版 实时数仓选型第一版 实时数仓分层: 计算框架:Flink;存储框架:消息队列(可以实时读取&可以实时写入)ODS:Kafka 使用场景:每过来一条数据,读取到并加工处理DIM: HBase 使用场景:事实表会根据主键获取一行维表数据(1.永…

jna中出现错误解决方案。

jna中出现错误解决方案 为什么会出现这些错误之JNA版本的锅不要手动导入jar包&#xff0c;使用maven切换高版本会出现的错误Structure.getFieldOrder() on class 错误java.lang.IllegalArgumentException: Invalid calling convention 63 错误 为什么会出现这些错误之JNA版本的…

人体跟随小车(旭日x3派,yolov5,ros2)

最终现象 人体跟随 策略 底盘主控是stm32f103c8t6&#xff0c;读取左右轮编码器并标定速度&#xff0c;读取mpu6050的yaw值一并传至上位机。上位机通过usb摄像头捕获图像&#xff0c;送入模型进行推理&#xff0c;根据得到的结果生成控制指令下发给底盘进行人体跟随。

【MySQL】redolog、undolog和binlog日志文件详解

【MySQL】redolog、undolog和binlog日志文件详解 前言redolog设计目标记录内容写入策略 undolog设计目标记录内容写入策略 binlog设计目标记录内容写入策略 小结 前言 当谈论MySQL数据库的日志文件时&#xff0c;通常会涉及到三种主要类型&#xff1a;redo log&#xff08;重做…

使用Python进行自然语言处理:情感分析

使用Python进行自然语言处理的热门应用:情感分析 自然语言处理(NLP)是人工智能领域中的一个重要分支,它致力于使计算机能够理解、解释和生成人类语言。在NLP的诸多应用中,情感分析是一项备受关注的热门应用之一。情感分析(Sentiment Analysis)是通过分析文本中的情感色…

陪诊小程序开发:线上陪诊行业的发展

在人口老龄化的严重的当下&#xff0c;老人看病也更加困难&#xff0c;而陪诊行业作为一个新型行业&#xff0c;正在走入人们的生活中&#xff0c;帮助大众解决看病难等问题&#xff0c;为大众带来便捷高效的就医环境。 随着互联网时代的到来&#xff0c;各行各业也都开始向线…

FaceDiffuser 部署笔记

目录 依赖项安装&#xff1a; win11 ffmpeg合并报错 修改后代码&#xff1a; facebook/hubert-base-ls960报错 我的解决方法&#xff1a; DiffSpeaker网络音频编码器&#xff1a; 头模加载 transformers 依赖项安装&#xff1a; "tokenizers": "tokeniz…

设置Ollama在局域网中访问的方法(Ubuntu)

趁着Llama3的热度试了一下Ollama&#xff0c;果然部署推理大模型很有用。一个现实的需求是&#xff0c;如果我们要在局域网中访问Ollama上大模型的服务&#xff0c;应该怎么办呢&#xff1f;参考了一下其他博客的方法 例如&#xff1a;一分钱不花&#xff01;手把手教你部署Go…

Android system — 链接器命名空间共享库配置方法(Android 11后)

Android system — 链接器命名空间共享库配置方法 1. 应用进程1.1 应用进程类加载器的命名空间初始化1.1.1 OpenNativeLibrary1.1.2 LibraryNamespaces::Create 1.2 配置共享库位置 2. native进程2.1 native 命名空间配置初始化2.1.1 android_namespace_t::is_accessible2.1.2 …

清理docker缓存

要清理Docker缓存&#xff0c;你可以使用以下命令&#xff1a; docker system prune 这个命令会删除所有未使用的容器、网络、镜像(默认不包括Tag为none的)和悬空的镜像。如果你也想要删除所有未使用的镜像&#xff0c;不仅仅是悬空的&#xff0c;可以添加-a参数&#xff1a;…

swift语言学习总结

Var 表示变量&#xff0c; let表示常量。数组和map&#xff0c; 都用中括号[].可以直接赋值。可以用下标或键访问。 var shoppingList ["catfish", "water", "tulips", "blue paint”]//最后一个可以加逗号。 shoppingList[1] "bo…

Web开发中的网络安全: 常见攻击及防范策略

在Web开发的世界里&#xff0c;网络攻击是一种常见且潜在的威胁。理解这些攻击如何运作并采取措施防范它们对于构建安全的Web应用至关重要。本文将介绍几种常见的Web攻击&#xff0c;提供防范策略&#xff0c;并以实例说明如何防止这些攻击。 SQL注入 概要: SQL注入攻击是攻击…

Python+Selenium基于PO模式的Web自动化测试框架

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供…

Linux pppstats命令教程:如何详解PPP连接的统计信息(附案例详解和注意事项)

Linux pppstats命令介绍 pppstats命令用于显示活动的PPP&#xff08;点对点协议&#xff09;连接的统计信息。这些统计信息包括发送和接收的数据包数量、压缩前和压缩后的数据量、IPCP和LCP协议的状态等。 Linux pppstats命令适用的Linux版本 pppstats命令在大多数Linux发行…

吴恩达机器学习笔记:第 8 周-14降维(Dimensionality Reduction) 14.3-14.5

目录 第 8 周 14、 降维(Dimensionality Reduction)14.3 主成分分析问题14.4 主成分分析算法14.5 选择主成分的数量 第 8 周 14、 降维(Dimensionality Reduction) 14.3 主成分分析问题 主成分分析(PCA)是最常见的降维算法。 在 PCA 中&#xff0c;我们要做的是找到一个方向…

C++与或运算规则

文章目录 前言问题1问题2 前言 在笔试中遇到c或与运算的问题&#xff0c;在这记录 问题1&#xff1a;2024.4.28 问题1 下面代码的运行结果&#xff1a; #include <iostream> using namespace std; bool fun1(char ch){cout<<ch<<" ";if(ch >a…