Java集合大总结——Map集合

news2025/1/23 17:41:00

Map集合框架

  • 1、Map集合框架
    • 1.1 关于Map接口中的主要实现类
    • 1.2 各实现类的特点:
  • 2. HashMap 和 Hashtable 的区别
  • 3. HashMap 和 HashSet 区别
  • 4. HashMap 和 TreeMap 区别

1、Map集合框架

注意:Map接口是在java.util.Map 的包下,Map 接口不是 Collection 的子接口,它是使用键、值映射表来存储【Map 不能有重复的键(覆盖),每个键可以映射到最多一个值】。
Map 接口的实现类较多,在此我们关注 HashMap 、 TreeMap 、 HashTable 、 LinkedHashMap

1.1 关于Map接口中的主要实现类

  1. 继承结构图如下所示
    在这里插入图片描述
  2. Map接口实现类的代码:
  • HashMap类:
public class HashMap<K,V> extends AbstractMap<K,V>
   implements Map<K,V>, Cloneable, Serializable 
  • TreeMap类:
public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable
  • LinkedHashMap类:
public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V>
  • Hashtable类:
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable

1.2 各实现类的特点:

  • HashMap
    • 基于哈希表的实现的 Map 接口
    • 允许 null 的值和 null 键
    • 非线程安全
    • 默认容量 16,默认负载因子 0.75
    • HashMap容量为什么是2的n次方
    • 扩容是 2 倍旧的容量
      • 扩容是旧容量的2倍的原因点击这里
    • 在存储数据时, key hash 计算调用的是 HashMap 中的 hash 方法
    • 添加value 值时,如果 hash 一样添加到链表尾部
    • 关于HashMap中添加元素的过程【put的过程】详细介绍点击这里
  • TreeMap
    • 继承 AbstractMap ,底层数据结构是一个红黑树基于 NavigableMap 实现
    • 非线程安全的
    • key 不能存 null ,但是 value 可以存 null
    • key 必须是可比较的 (即要么实现 Comparable 接口,要么传递一个 Comparator 比较器)
  • Hashtable
    • 该类实现了一个哈希表,它将键映射到值
    • 不允许 null 作为键和值
    • 默认初始容量(initialCapacity)为 11 ,默认负载因子( loadFactor )为 0.75f
    • 同步的(线程安全的)
    • 不保证顺序
    • 扩容方式是旧容量的2倍 +1
      • 为什么hashtable的扩容方式选择为2n+1,可点击这里查看
      • 为了均匀分布,降低冲突率
    • 数组 + 链表方式存储
    • 添加值时
      • 如果 hash 一样 equals 为 false 则将当前值添加到链表头
      • 如果 hash 一样 equals 为 true 则使用当前值替换原来的值 ( key 相同)。
  • LinkedHashMap
    • 哈希表和双向链表实现的 Map 接口
    • 具有可预测的迭代次序(有序)
    • 非线程安全
    • 允许空元素

2. HashMap 和 Hashtable 的区别

  • 线程是否安全: HashMap 是非线程安全的, Hashtable 是线程安全的,因为Hashtable 内部的方法基本都经过synchronized修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!,Hashtable已经过时了);
  • 效率: 因为线程安全的问题, HashMap 要比 Hashtable 效率高一点。
  • Null key Null value 的支持: HashMap 可以存储 nullkeyvalue,但 null 作为键只能有一个,null 作为值可以有多个;Hashtable 不允许有null键和null值,否则会抛出 NullPointerException 。
  • 初始容量大小和每次扩充容量大小的不同:
    • 创建时如果不指定容量初始值, Hashtable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1
    • HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍
    • 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小
  • 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间。 Hashtable 没有这样的机制。

3. HashMap 和 HashSet 区别

  • HashSet 底层就是基于 HashMap 实现的。
  • 实现接口不同
    • HashMap 实现Map接口
    • HashSet 实现Set接口
  • 存储不同
    • HashMap 存储键值对
    • HashSet 存储对象
  • 添加方式不同
    • HashMap 调用put()添加元素
    • HashSet 调用add()添加元素
  • 计算HashCode不同
    • HashMap 使用键(Key)计算 hashcode
    • HashSet 使用成员对象来计算hashcode值,对于两个不同的对象来说hashcode 可能相同,所以还要用 equals() 方法用来判断对象的相等性.

4. HashMap 和 TreeMap 区别

  1. TreeMap 和 HashMap 都继承自 AbstractMap ,但是需要注意的是 TreeMap 它还实现了 NavigableMap 接口和 SortedMap 接口。
  2. 实现NavigableMap接口让 TreeMap 有了对集合内元素的搜索的能力。
  3. 实现SortedMap接口让 TreeMap 有了对集合中的元素根据键排序的能力。

综上,相比于HashMap来说 TreeMap 主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力。

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

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

相关文章

深度学习面试八股文(2023.9.06)

一、优化器 1、SGD是什么&#xff1f; 批梯度下降&#xff08;Batch gradient descent&#xff09;&#xff1a;遍历全部数据集算一次损失函数&#xff0c;计算量开销大&#xff0c;计算速度慢&#xff0c;不支持在线学习。随机梯度下降&#xff08;Stochastic gradient desc…

知识库搭建最简单的方法:登录、创建、优化,就这三步!

实际应用中&#xff0c;企业所需要的知识库场景不止一个&#xff0c;更多是很多场景的复合模式&#xff0c;甚至还需要不同团队间的协作配合&#xff0c;这个时候就还需要去考虑不同部门/团队间的业务拉通。 搭建知识库 所以当我们搭建知识库的时候&#xff0c;不仅要掌握基础…

【每天一道算法题】day2-认识时间复杂度

认识时间复杂度&#xff1a; O&#xff1a;读作big O&#xff0c;在数学上指的是上限的意思 常数时间的操作 一个操作如果和样本的数据量没有关系&#xff0c;每次都是固定时间内完成的操作&#xff0c;叫做常数操作。时间复杂度为一个算法流程中&#xff0c;常数操作数量的一…

docker系列(1) - docker环境篇

文章目录 1. docker环境1.1 docker安装1.2 阿里云镜像加速器1.2 docker管理工具(portainer)1.3 docker网络1.3.1 网络说明1.3.2 创建指定网关的网络 1. docker环境 1.1 docker安装 #CentOS 6 rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noar…

windows10系统-14-VirtualBox中的设置

VirtualBox 常用设置说明 Ubuntu-server18.04.2LTS安装VirtualBox增强功能 VirtualBox官网 使用VirtualBox一步一步安装Ubuntu 22.04 ubuntu server官网安装教程 1 新建虚拟机 (1)点击新建&#xff0c;在新建虚拟电脑对话框填入虚拟电脑的名称&#xff0c;保存的位置。推荐保…

代码随想录第41天| 343.整数拆分,96.不同的二叉搜索树

343.整数拆分 这道题全程懵逼 343. 整数拆分 class Solution {public int integerBreak(int n) {//推论一&#xff1a; 若拆分的数量 a 确定&#xff0c; 则 各拆分数字相等时 &#xff0c;乘积最大。//推论二&#xff1a; 将数字 n尽可能以因子 3等分时&#xff0c;乘积最大…

ElementPlus·面包屑导航实现

面包屑导航 使用vue3中的UI框架elementPlus的 <el-breadcrumb> 实现面包屑导航 <template><!-- 面包屑 --><div class"bread-container" ><el-breadcrumb separator">"><el-breadcrumb-item :to"{ path:/ }&quo…

apt安装yum

配置apt国内镜像源 /etc/apt/sources.list deb https://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ trusty-…

19 螺旋矩阵

螺旋矩阵 题解1 循环&#xff08;4个标志——根据顺时针&#xff09;题解2 方向 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 提示&#xff1a; - m matrix.length - n matrix[i].length - 1 < m, n <…

LVS NAT模式负载均衡群集部署

目录 1 群集(集群) cluster 1.1 群集的类型 2 LVS的工作模式及其工作过程 2.1 NAT模式&#xff08;VS-NAT&#xff09; 2.2 直接路由模式&#xff08;VS-DR&#xff09; 2.3 IP隧道模式&#xff08;VS-TUN&#xff09; 3 LVS-NAt 模式配置步骤 3.1 部署共享存储 3.2 配…

【全网最全protobuf中文版教程】

protocal buffer Notes 文章目录 protocal buffer Notes为什么是ProtoBufprotoBuf数据要素字段编号标签字段类型标量枚举复合类型mapgroup 导入其他消息类型编码解码编码解码 proto生成文件 为什么是ProtoBuf 通常&#xff0c;程序运行时产生的一些结构化数据会经历存储或者与…

基于Java+SpringBoot+Vue校园求职招聘系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

docker系列(2) - 常用命令篇

文章目录 2. docker常用命令2.1 参数说明(tomcat案例)2.2 基本命令2.3 高级命令2.4 其他 2. docker常用命令 2.1 参数说明(tomcat案例) 注意如果分成多行&#xff0c;\后面不能有空格 # 拉取运行 docker run \ -d \ -p 8080:8080 \ --privilegedtrue \ --restartalways \ -m…

docker系列(5) - docker仓库

文章目录 5 docker仓库5.1 创建命名空间5.2 创建镜像仓库5.3 设置访问凭证5.3 镜像仓库命令信息5.4 登录阿里云上传镜像5.5 拉取镜像运行5.6 私有仓库(docker Registry)5.6.1 安装docker registry5.6.2 准备镜像5.6.2 本地私服仓库5.6.3 推送到私服仓库5.6.4 拉取私服镜像 5 do…

信息系统项目管理师(第四版)教材精读思维导图-第十三章项目资源管理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图源文件 13.1 管理基础 13.2 管理过程 13.3 规划资源管理 13.4 估算活动资源 13.5…

2023/9/10周报

目录 摘要 文献阅读1 1、标题和提出问题 2、小波变换 3、Encoder和Decoder 4、模型结构 5、实验 文献阅读2 1、标题和提出问题 2、高斯扩散模型和烛台图 3、研究方法 4、实验准备 5、实验结果 总结 摘要 本周阅读了两篇论文&#xff0c;其一为一种基于空气质量时…

数字图像滤波的本质

一、说明 在数字时代&#xff0c;图像是我们交流和表达不可或缺的一部分。从社交媒体到医学成像&#xff0c;图像的质量和内容非常重要。这就是图像过滤和卷积领域介入的地方&#xff0c;为我们提供了一个转换和完善这些视觉叙事的工具包。 图像过滤不仅仅是让照片看起来更好;这…

浙大MBA二战上岸:笔试备考辛酸路

作为一个即将进入三十而立年纪的考生&#xff0c;我深切感受到了压力的存在。在决定是否要将这么多时间和精力投入到考研中时&#xff0c;我开始思考这决定是否值得。毕竟参加二战考试需要付出大量的时间成本和努力。最终经过反复权衡和深思熟虑&#xff0c;我认为这是值得的。…

总结 - 组件通用封装思路(组件封装)

组件封装&#xff1a; 1. 不变&#xff1b; 2. 变&#xff1a;①prop ②slot插槽 详细总结在文末。 --------------------------------------------------------------------------------------------------- 问题&#xff1a;结构相似&#xff0c;内容不同 --》 可以用组…

注意力机制讲解与代码解析

一、SEBlock(通道注意力机制) 先在H*W维度进行压缩&#xff0c;全局平均池化将每个通道平均为一个值。 &#xff08;B, C, H, W&#xff09;---- (B, C, 1, 1) 利用各channel维度的相关性计算权重 (B, C, 1, 1) --- (B, C//K, 1, 1) --- (B, C, 1, 1) --- sigmoid 与原特征相…