[Java] HashMap 源码简要分析

  • 允许null作为key/value。

  • 不保证按照插入的顺序输出。使用hash构造的映射一般来讲是无序的。

  • 非线程安全。

  • 内部原理与Hashtable类似。

源码简要分析

java;gutter:true; public class HashMap { static final int DEFAULT_INITIAL_CAPACITY = 16 ; // 默认初始容量是16。(必须是2的次方) static final int MAXIMUM_CAPACITY = 1 << 30 ; // 即2的30次方 static final float DEFAULT_LOAD_FACTOR = 0.75f; // 默认装载因子</p> <pre><code> Entry[] table; // Entry表 int size; // Entry[]实际存储的Entry个数 int threshold; // reash的阈值,=capacity * load factor final float loadFactor; // 构造函数 public HashMap(int initialCapacity, float loadFactor) { // 找到一个比initialCapacity大的最小的2的次方数 int capacity = 1; while (capacity < initialCapacity) capacity < e = table[bucketIndex]; table[bucketIndex] = new Entry<>(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); } // put():添加元素 public V put(K key, V value) { int hash = hash(key.hashCode()); // key的hash值 int i = indexFor(hash,table.length); // 槽位 // 寻找是否已经有key存在,如果已经存在,使用新值覆盖旧值,返回旧值 for (Entry e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; return oldValue; } } // 添加Entry addEntry(hash,key,value,i); return null; } // resize():重新哈希 void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; Entry[] newTable = new Entry[newCapacity]; transfer(newTable); table = newTable; threshold = (int)(newCapacity * loadFactor); } /** * Transfers all entries from current table to newTable. */ void transfer(Entry[] newTable) { Entry[] src = table; int newCapacity = newTable.length; for (int j = 0; j < src.length; j++) { Entry e = src[j]; if (e != null) { src[j] = null; do { Entry next = e.next; int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next; } while (e != null); } } } </code></pre> <p>}</p> <pre><code> 遍历方式 * 低效遍历:按照Key进行遍历,则每次都需要按Key查找槽位(不同的Key有重复查找),且可能需要遍历槽位上所在Entry链表(不同的Key有重复遍历)。 * 高效遍历:HashMap的entrySet()返回自定义的EntryIterator,是先按照槽位遍历一次,再遍历一次槽位上Entry链表。 ;gutter:true;
Map paraMap = new HashMap();
for( Map.Entry entry : paraMap.entrySet() )
{
String appFieldDefId = entry.getKey();
String[] values = entry.getValue();
}

Original: https://www.cnblogs.com/caca/p/java_hashmap.html
Author: cacard
Title: [Java] HashMap 源码简要分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/536645/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Tinker Flutter热修复

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年9月22日
    0260
  • Java面向对象(一)

    Java面向对象(一) Java面向对象(一) – 一、面向过程(POP)与面向对象(OOP) 二、类和对象 2.1 类及类的成员 2.2 对象的创建与使用 2.3 类…

    Java 2023年6月9日
    064
  • Docker安装Jenkins打包Maven项目为Docker镜像并运行【保姆级图文教学】

    一、前言 Jenkins作为CI、CD的先驱者,虽然现在的风头没有Gitlab强了,但是还是老当益壮,很多中小公司还是使用比较广泛的。最近小编经历了一次Jenkins发包,感觉还不…

    Java 2023年6月15日
    076
  • Java POJO划分

    PO Persistant Object 的缩写,用于表示数据库中的一条记录映射成的 java 对象。PO 仅仅用于表示数据,没有任何数据操作。通常遵守 Java Bean 的规范…

    Java 2023年5月29日
    065
  • 用antlr的grammar获得java ast

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年9月21日
    0135
  • 在阿里云安装【Node-RED】+pm开机自启动

    必要条件: 一个云服务器。可以按照个人习惯在阿里云或者腾讯云购买,阿里云有学生优惠。 使用终端工具登录主机,这里可以使用Windows自带的”powershell&#8…

    Java 2023年6月8日
    061
  • Linux安装JDK

    一、去java官网下载对应版本的JDK https://www.java.com/en/download/manual.jsp 选择对应版本下载,现在下载好像要注册Oracle账户…

    Java 2023年6月8日
    062
  • 超详细干货!Docker+PXC+Haproxy搭建高可用强一致性的MySQL集群

    前言 干货又来了,全程无废话,可先看目录了解。MySQL搭建集群最常见的是binlog方式,但还有一种方式是强一致性的,能保证集群节点的数据一定能够同步成功,这种方式就是pxc,本…

    Java 2023年6月9日
    056
  • 设计模式之策略模式

    在一个收银系统中,如果普通用户、中级会员、高级会员分别对应着不同的优惠策略,常规编程就要使用一系列的判断语句,判断用户类型,这种情况下就可以使用策略模式。 一、概念理解 策略模式的…

    Java 2023年6月8日
    083
  • docker进阶

    Docker Compose Docker DockerFile build run 手动操作,单个容器 微服务,100个微服务,依赖关系 Docker Compose来轻松高效的…

    Java 2023年6月9日
    0156
  • 替代 Hystrix,Spring Cloud Alibaba Sentinel 快速入门

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年9月22日
    0290
  • 接口的 COM 组件调用 QueryInterface 因以下错误而失败: 库没有注册。

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年10月24日
    0304
  • 好玩Python——PIL项目实训(四)

    1 # -*- coding: utf-8 -*- 2 """ 3 Created on Tue Apr 14 04:08:43 2020 4 5 @…

    Java 2023年6月6日
    076
  • Spring Cloud中Hystrix仪表盘学习(笔记)

    先简单介绍一下Hystrix: Hystrix是由Netflflix开源的一个延迟和容错库,由于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。 H…

    Java 2023年6月5日
    068
  • 代码生成器

    Mybatis Generator 使用xml配置文件形式自动生成 只生成实体类、mapper接口及mapper.xml。并且包含丰富的内容 首先添加mybatis依赖和相关插件 …

    Java 2023年6月13日
    070
  • K8S 使用deploy部署nginx

    K8S 使用deployment 部署nginx服务 deploy文件如下: [root@k8s-master ~]# cat deploy.yaml apiVersion: ap…

    Java 2023年5月30日
    042
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球