hashmap java

HashMap基于哈希算法工作,根据Java文档HashMap具有以下四个构造函数,

建设者 描述
HashMap ​() 构造一个空的
具有默认初始容量(16)和默认加载因子(0.75)的HashMap
HashMap ​(int initialCapacity) 构造一个空的
具有指定初始容量和默认加载因子(0.75)的HashMap
HashMap ​(int initialCapacity,
float loadFactor)
构造一个空的
具有指定初始容量和负载因子的HashMap
HashMap ​( Map <? extends K ,? extends V > m) 构造一个新的
HashMap具有与指定相同的映射
Map

让我们编写一个简单的Java程序,以检查Map在内部如何工作

  1. 创建一个简单的Map并为其添加一个键和值
public static void main(String[] args) {Map<Integer, String> map = new HashMap<>();map.put(1, "Java");}

我们刚刚创建了简单映射,该映射将键作为整数,将值作为字符串,并添加了“ 1”作为键和“ Java”作为值。 通过使用eclipse调试功能,我们可以查看地图中的内容

它创建了16个块(0-15),并插入了第一个块,其键为整数“ 1”,值为字符串“ Java”。 请选中红色框,其余所有都用null初始化的框。

2.将第二个键和值添加到同一地图

public static void main(String[] args) {Map<Integer, String> map = new HashMap<>();map.put(1, "Java");map.put(2, "Angular");}

让我们再次在Eclipse调试中查看地图

现在,地图包含了两个键(1,2)和两个值(“ Java”,“ Angular”),但这些键分别分别精确地添加到了第一个块和第二个块,为什么?

因为我们知道Map是基于哈希算法工作的,所以每当我们插入要映射的键时,它都会根据hashCode()的值调用Object#hashcode()方法,它将把键插入该块中。

在上述情况下,Integer类使用其原始int值覆盖hashCode,这就是为什么(1,java)存储在第一个块中,而(2,Angular)存储在第二个块中的原因。

3.让我们对自己的班级做同样的实验

创建一个简单的Employee类,如下所示

private static class Employee{
int id;
String name;Employee(int id, String name){
this.id = id;
this.name = name;
}
}

使用此类作为地图的键,并以相同的方式进行检查

public static void main(String[] args) {
Map<Employee, String> map = new HashMap<>(10);
map.put(new Employee(1, "Ramesh"), "Java");
map.put(new Employee(2, "Sathish"), "Angular");
}

我们添加了两个键作为Employee对象,并将Values作为字符串添加,让我们看看这次存储在哪个块中的键

这次,将其存储在第8个块和第14个块中(为什么?由于Employee对象的hashCode而给出简单答案),以确认这一点,让Employee的hashCode()重写为常数并检查映射。 如果我们的分析正确,则必须将所有密钥存储在同一块中。

相应地更新Employee类

private static class Employee{
int id;
String name;
Employee(int id, String name){
this.id = id;
this.name = name;
}
@Override
public int hashCode() {
return 10;
}
}

我们不需要对地图进行任何更改,现在让我们看看密钥的存储位置

是的,只有第10个块充满了两个对象,为什么? 因为两个雇员对象都返回相同的hashCode(即10)。 但是,Map如何识别这两个对象不是重复的? 我们从内部知道Map#Key是entrySet(java.util.Set),它调用equals方法来验证键是否重复。

同时从Map中检索值时,首先将检查给定键的hashCode,然后基于该哈希值将转到该块,在找到该块之后,它将调用equals()以获取确切值。

因此,完全不建议将hashCode()重写为constant当我们重写hashCode()时,我们也不要忘记重写equals()方法 (即hashCode()/ equals()合约)。

翻译自: https://www.javacodegeeks.com/2017/11/java-hashmap-detail-explanation.html

hashmap java

hashmap java_Java – HashMap详细说明相关推荐

  1. HashMap 源码详细分析(JDK1.8)

    1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...

  2. HashMap 源码详细分析(JDK1.8) 1

    1.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值, ...

  3. HashMap嵌套HashMap 的 案例

    第一步:首先创建三个HashMap集合. 以学校制度为案例(学校 - 班级 - 学生): HashMap<Student,String> hm1 = new HashMap<> ...

  4. Hashmap 面试题 + Hashmap 原理 + Hashmap 源码(史上最全)

    HashMap作为我们日常使用最频繁的容器之一,相信你一定不陌生了.今天我们就从HashMap的底层实现讲起,深度了解下它的设计与优化. 常用的数据结构 我在05讲分享List集合类的时候,讲过Arr ...

  5. java hashmap value_Java HashMap values() 方法

    values() 方法返回映射中所有 value 组成的 Set 视图. 语法 values() 方法的语法为: hashmap.values() 注:hashmap 是 HashMap 类的一个对象 ...

  6. 第三次学JAVA再学不好就吃翔(part94)--HashMap嵌套HashMap

    学习笔记,仅供参考,有错必纠 HashMap嵌套HashMap 没啥好说的,直接看代码. 输入: package com.guiyang.bean;import java.util.HashMap;p ...

  7. hashmap clone_Java HashMap clone()方法与示例

    hashmap clone HashMap类clone()方法 (HashMap Class clone() method) clone() method is available in java.u ...

  8. Java之HashMap系列--HashMap扩容的原理

    原文网址:Java之HashMap系列--HashMap扩容的原理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的HashMap是如何扩容的. 重要大小 类 初始容量 最大容量 扩容 ...

  9. HashMap/HashMap存储/HashMap扩容

    HashMap Java 集合,也称作容器,主要是由两大接口 (Interface)派生出来的:Collection 和 Map. Map集合体系: Map集合特点: (1) 键值对存储(key-va ...

最新文章

  1. MySQL面试题 | 附答案解析(十一)
  2. Oracle监听配置
  3. python对象不接受参数什么意思___new\=TypeError:object()不接受参数
  4. Asp.Net 创建MetaWeblog API
  5. springcloud 相同服务名_SpringCloud系列之SpringCloud Stream
  6. python列表转换成数字_python 字母转成数字Python操作列表的常用方法总结
  7. 互联网日报 | 2021年春运火车票今起开抢;好未来达成33亿美元私人配售协议;盒马mini开进菜场...
  8. uboot命令及内核启动参数
  9. java接收ajax上传文件_使用ajax方式上传文件
  10. 《嵌入式 – GD32开发实战指南》第15章 低功耗(电源管理)
  11. 常见反爬虫方法及其应对策略
  12. 全球云服务商是怎么排名的?国内云主机市场占有率份额排行对比
  13. mysql7.6安装_CentOS7.6离线安装MySql5.7
  14. linux访问网络图片,linux网络图形监控方法
  15. github提交时报错:remote: Support for password authentication was removed on August 13, 2021问题解决方案
  16. \t\t【团队精神】荣辱与共 交流分享 精诚协作 尊重理解 ——程序员应知
  17. RTL8812F/RTL8197F修改beacon间隔
  18. 装个JCreator+JDK文档
  19. Android Kotlin + 协程 + Retrofit + MVVM优雅的实现网络请求(简洁!!!!)
  20. 弃百万年薪加入创业期阿里拿500元,他证明选择和努力同样重要

热门文章

  1. [2.7]【CF933A】A Twisty Movement【CF926B】Add Points【CF917A】The Monster【CF919E】Congruence Equation
  2. P6623-[省选联考2020A卷]树【Trie,树上启发式合并】
  3. P5135-painting【组合数学】
  4. 【2018.4.14】模拟赛之一-ssl2391 数列
  5. 【2018.3.24】模拟赛之三-ssl2547 圆环【数论】
  6. HDU1812 - Count the Tetris
  7. 一道有趣的最短路 NEERC2017 Journey from Petersburg to Moscow
  8. 16、mysql中函数的创建和使用
  9. 13、字符集和字符编码
  10. K8S Learning(2)——集群环境搭建