从源码分析HashMap集合之属性(一)

2023-05-16

注:笔者所使用的jdk为1.8,因本人水平有限,难免会有错误,请批评指正,弥补不足,多谢,另转载请注明出处。

我们首先来看下一下HashMap类

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable

可以看到,HashMap类继承了AbstractMap类,实现了Map<K,V>接口,Cloneable接口,Serializable接口

我们一个一个来看下HashMap中定义的属性、静态内部类和方法

1.属性:

1.默认初始容量(1<<4 的值为16)

/**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

HashMap是使用哈希表的数据结构存储数据的,这个初始化数量就是初始化哈希表中筒的数量,也就是下图哈希表中左边16个存储空间。如果我们在创建HashMap没有指定桶的数量的话,那么默认就是16个,初始值必须是2的倍数

(图片来自百度)

2.最大容量(1<<30 这是一个很大的数,2的30次方,为1073741824)

  /**
     * The maximum capacity, used if a higher value is implicitly specified
     * by either of the constructors with arguments.
     * MUST be a power of two <= 1<<30.
     */
    static final int MAXIMUM_CAPACITY = 1 << 30;

这个表示哈希表的桶的数量最大为2的30次方个,这个我们很少涉及,一般会不临时存储到这个数量级的数据,最大容量值同样也必须是2的倍数

3.默认加载因子

/**
     * The load factor used when none specified in constructor.
     */
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

这个加载因子的作用就是,比如我们创建一个HashMap但是没有指定初始容量,那么创建的哈希表有16个桶,但是这16个桶很有可能不够用啊,那么就需要扩展桶的数量,那么问题来了,什么时候应该扩展桶的数量那?答案就在这个加载因子上了。答案是当桶的数量达到 当前桶数量*加载因子时,就将桶的数量扩充为当前桶数量的2倍。比如目前16个桶,那么当16*0.75=12,当12个桶存储数据后,哈希表的桶会扩充为32个,用来准备存储更多的数据。

4.TREEIFY_THRESHOLD

 /**
     * The bin count threshold for using a tree rather than list for a
     * bin.  Bins are converted to trees when adding an element to a
     * bin with at least this many nodes. The value must be greater
     * than 2 and should be at least 8 to mesh with assumptions in
     * tree removal about conversion back to plain bins upon
     * shrinkage.
     */
    static final int TREEIFY_THRESHOLD = 8;

这个我们来看官方jdk的注释,注释是“使用树而不使用链表的阈值,当桶中元素超过这个阈值时,使用树容器替换链表”。顾名思义,在哈希表中,每个桶中的数据是以链表的形式存储的,但是当元素数量达到8时,使用树的结构存储桶中的数据。

5.UNTREEIFY_THRESHOLD


    /**
     * The bin count threshold for untreeifying a (split) bin during a
     * resize operation. Should be less than TREEIFY_THRESHOLD, and at
     * most 6 to mesh with shrinkage detection under removal.
     */
    static final int UNTREEIFY_THRESHOLD = 6;

这个我们看官方的jdk注释,注释是“执行调整大小操作,如果桶中的元素小于这个阈值,则使用链表替换树”

6.MIN_TREEIFY_CAPACITY

  /**
     * The smallest table capacity for which bins may be treeified.
     * (Otherwise the table is resized if too many nodes in a bin.)
     * Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
     * between resizing and treeification thresholds.
     */
    static final int MIN_TREEIFY_CAPACITY = 64;

注释的意思是“可被树化的最小表容量”。我们从上面可以知道,哈希表中的桶中的元素可以用链表或者树来存储,那么什么时候用树存储那?答案是需要满足哈希桶的数量要达到64这个条件,并且需要是TREEIFY_THRESHOLD数量的4倍以上。

 

在后面的文章中继续分享HashMap中的内部静态类和方法源码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从源码分析HashMap集合之属性(一) 的相关文章

  • 同构弦

    给定两个字符串 s 和 t 确定它们是否同构 如果 s 中的字符可以替换得到 t 则两个字符串是同构的 所有出现的字符都必须替换为另一个字符 同时保留字符的顺序 任何两个字符都不能映射到同一个字符 但一个字符可以映射到其自身 例如 给定 e
  • Android 使用包含另一个 hashmap 的 hashmap 实现 Parcelable 对象

    这是一个扩展Android 实现具有 hashmap 的 Parcelable 对象 https stackoverflow com questions 22498746 android implement parcelable objec
  • 如何断言两个具有 Javabean 值的 HashMap 相等?

    我有两个HashMap
  • Amazon S3s 密钥背后的数据结构(过滤数据结构)

    我想实现一个类似于 Amazon S3 的查找功能的数据结构 就上下文而言 Amazon S3 将所有文件存储在平面命名空间中 但允许您通过文件名中的公共前缀查找文件组 从而复制目录树的功能 但又不那么复杂 问题是 查找和过滤操作都是 O
  • 如何按整数值对哈希图进行排序[重复]

    这个问题在这里已经有答案了 HashMap
  • 二和 Leetcode 解释、Hashmap、Javascript

    我只是想知道谁能一步一步解释这个解决方案的算法 我不知道哈希图是如何工作的 您能否还提供一个使用哈希图的基本示例 以便我理解该算法 谢谢你 var twoSum function nums target let hash for let i
  • Java HashMap - 深拷贝

    我只是想找出如何进行深层复制的最佳解决方案HashMap 该映射中没有对象实现Cloneable 我想找到比序列化和反序列化更好的解决方案 看一眼深度克隆 在 Google Code 上您可以找到一个库 你可以阅读它https github
  • Java HashMap 与 ArrayList 相比的内存开销

    我想知道java HashMap与ArrayList相比的内存开销是多少 Update 我想提高搜索一大包 600 万以上 相同对象的特定值的速度 因此 我正在考虑使用一个或多个HashMap来代替ArrayList 但我想知道 HashM
  • 获取带有注释的所有类并将它们添加到 android 中的 hashMap

    我不确定这是否可能 但我基本上希望能够轻松地将新项目添加到列表中 只需添加带有特殊注释的类即可 我能想到的唯一例子就是我目前正在做的事情 用户可以完成很多 挑战 目前我的应用程序中有一个用于 挑战 的包 我希望能够在该包中创建一个新类 给它
  • 如何混淆整数?

    我需要从 C 中的整数列表生成唯一值的列表 我以为是 MD5 或类似的 但它们生成了太多字节 整数大小为 2 个字节 例如 我想获得单向通信 0 gt ARY812Q3 1 gt S6321Q66 2 gt 13TZ79K2 因此 在证明哈
  • Java 中的 HashMap 和 Map 对象有什么区别?

    我创建的以下地图之间有什么区别 在另一个问题中 人们似乎可以互换使用它们来回答 我想知道它们是否 如何不同 HashMap
  • Java 弱哈希映射 - 需要根据值的弱点而不是键来删除条目

    所以JavaWeakHashMap让我们创建一个映射 如果其键变弱 则删除该映射的条目 但是我怎样才能创建一个Map 当它的条目被删除时values地图上变弱了 我想使用映射的原因是作为全局哈希表 它根据对象的 ID 跟踪对象 ID gt
  • 在 Python 中进行模糊键查找的最佳方法?

    我遇到一个问题 我需要在哈希映射中进行模糊查找 即返回与最接近查询的键相对应的值 在我的例子中是通过 Levenshtein 距离测量的 我目前的方法是子类化dict使用特殊的查找方法计算所有键的编辑距离 然后返回得分最低的键的值 基本上是
  • 哈希表的空间复杂度是多少?

    具有 32 位键和指向单独存储的值的 32 位指针的哈希表的大小是多少 是 2 32 个槽 4 字节 键 4 字节 指向值的指针 4 10 9 4 4 32GB 我想了解哈希表的空间复杂度 我认为你问错了问题 数据结构的空间复杂度表示它占用
  • 如何在出现“无法解析放置符号”错误时向哈希图添加键和值

    我正在与安卓工作室 https en wikipedia org wiki Android Studio1 4 1 我刚刚创建了一个 Hashmap 并正在遵循有关如何填充和操作它的教程 Java 语言 但是 我收到 无法解析符号放置 错误
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 删除 HashMap 中包含的列表项

    我有一个Hashmap
  • Java HashMap 嵌套泛型与通配符

    我正在尝试创建包含自定义类的不同子类的哈希集的哈希映射值的哈希映射 如下所示 HashMap
  • 如何制作具有两个索引的 Map?

    我在java中有一张这样的地图 Map
  • 使用 HashMap 映射 String 和 int

    我有一个显示国家 地区名称的列表视图 我已将名称作为字符串数组存储在 strings xml 中 称为国家 地区名称 在填充 ListView 时 我使用从 strings xml 读取的 ArrayAdapter String count

随机推荐

  • [运维|系统] 在飞腾FT2000上安装CentOS7

    环境说明 平台 xff1a aarch64 CPU 型号 xff1a FT2000 43 BIOS固件 xff1a 昆仑固件 内存 xff1a 32G 5 启动盘制作 见使用dd命令制作linux启动盘 下载系统 centos 7 ARM6
  • [开发|C++] Qt编译Sqlite3数据库驱动

    系统环境 系统 xff1a Deepin 20 2 1 Qt版本 xff1a 5 15 1 qmake版本 xff1a 3 1 Gcc版本 xff1a 8 3 0 源代码下载 见Qt常用资料 中科大镜像站下载点 编译依赖安装 span cl
  • 中国移动家庭智能网关超级账号密码(广西桂林)

    原文地址中国移动家庭智能网关超级账号密码 超级帐户名是 xff1a admin 密码 xff1a Cmcc10086
  • [运维] systemd服务中配置环境变量

    参考文献如何在systemd服务中设置环境变量 xff1f etc systemd system myservice service如下所示 xff1a span class token punctuation span Unit span
  • [运维] wvp 28181安装部署全流程

    部署wvp 系统环境 系统版本 xff1a centos 7 9 安装java git yum span class token function install span java 11 openjdk span class token
  • [文档] 接口设计说明书

    1 范围 1 1 标识 本条应描述本文档所适用的系统 接口实体和接口的完整标识 xff0c 使用时 xff0c 包括其标识号 名称 缩 略名 版本号和发布号 1 2 系统概述 本条应概述本文档适用的系统和软件的用途 xff1b 描述系统和软
  • [运维] 金仓数据库使用笔记

    环境说明 系统 xff1a 银河麒麟V10 平台 xff1a amd64 数据库版本 xff1a KingbaseES V8 命令说明 sys dump 命令参数说明 见pg dump ksql 命令参数说明 见psql 操作 创建数据库
  • [linux] tar命令使用笔记(持续更新)

    打包tar gz包 span class token function tar span czvf xxx tar gz xxx
  • Maven项目管理工具学习笔记

    Maven项目管理工具学习笔记 由于本人在最近的项目中使用到了Maven xff0c 但是之前对Maven并没有深入地了解 xff0c 所以借此机会 xff0c 在网上查阅资料 xff0c 对Maven进行进一步的了解 xff0c 并做记录
  • [开发|java] java 通过多个字符串参数构造字符串数组

    可以使用Java中的可变参数 varargs 来通过多个字符串参数构造字符串数组 示例代码如下 xff1a span class token keyword public span span class token class name S
  • 远程连接Remote Desktop Manager Mac版 2022最新

    Remote Desktop Manager Mac中文版是目前Mac平台上最好用的一款远程桌面管理工具 xff0c Remote Desktop Manager Mac版除了可以多个远程桌面连接 多个ftp连接之外 xff0c 还可以管理
  • Android onNewIntent()需要注意的一些问题

    一 场景 最近遇到一个需求 xff1a 有A B C三个页面 xff0c A能跳到B xff0c 然后B会跳到C xff0c C还能跳到B xff0c 反正B和C两个页面能互相跳 xff0c 但是C页面点击返回的时候要回到A xff08 p
  • ffmpeg按桢截图

    ffmpeg ss 10 i input flv y f image2 vframes 1 s 352x240 b 03d jpg 参数解释 i 输入文件 y 覆盖 f 生成图片格式 ss 开始截图时间 seconds or in hh m
  • 如何检查Mac配备的显卡(GPU)?

    为了在屏幕上显示图形 xff0c Mac使用了图形卡 xff0c 通常称为图形处理单元 xff08 或GPU xff09 xff0c 该图形卡可以集成到Mac或离散卡上 GPU决定了Mac在游戏和其他应用程序中渲染图形的速度 那么该如何检查
  • Hive装载数据命令

    必须在表定义时创建partition a 单分区建表语句 xff1a create table day table id int content string partitioned by dt string 单分区表 xff0c 按天分区
  • OpenCore Gen-X :一键制作黑苹果OpenCore EFI文件

    OpenCore Gen X 是mac上一款黑苹果OC引导配置制作小工具 xff0c 可以一键制作黑苹果OpenCore EFI文件 xff0c 不过该 app 需要 macOS 环境才能运行 xff0c 没有的用户可以先使用虚拟机安装 m
  • 黑苹果OC配置工具OpenCore Configurator 2.42.0.0中文版

    OpenCore Configurator 一款黑苹果OC引导配置工具 xff0c 通过简化的图形界面帮助您为 OpenCore EFI 引导加载程序创建自定义配置文件 OC 是 OpenCore 的简称 xff0c 说起 OpenCore
  • 为什么无法在 Adobe XD 中导入或导出文件?

    Adobe Experience Design 是UI设计人员必备的图形化界面UX设计工具 xff01 在使用过程中用户会反馈无法导入或导出文件 xff1f 本文为 Adobe XD 中出现的文件导入和导出问题提供了解决方案 xff0c 并
  • 如何安装ArchLinux

    本文基于ArchLinux xff08 https www archlinux org xff09 Current Release 2013 08 01的ISO写的安装教程 xff01 ISO下载地址 xff1a http mirrors
  • 从源码分析HashMap集合之属性(一)

    注 xff1a 笔者所使用的jdk为1 8 xff0c 因本人水平有限 xff0c 难免会有错误 xff0c 请批评指正 xff0c 弥补不足 xff0c 多谢 xff0c 另转载请注明出处 我们首先来看下一下HashMap类 public