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

Java – HashMap详细说明相关推荐

  1. LeetCode(13.罗马数字转整数) JAVA Hashmap

    LeetCode(13.罗马数字转整数) JAVA Hashmap 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D ...

  2. java HashMap的使用

    java HashMap的使用 import java.util.HashMap; import java.util.Iterator; public class WpsklHashMap { pub ...

  3. Java HashMap工作原理深入探讨

    大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道 HashMap内部如何工作呢?几天前,我阅读了java.util.H ...

  4. Java HashMap的死循环的启示

    在酷壳上看到博主陈皓写的最新文章疫苗:Java HashMap的死循环.博主看问题非常透彻,代码分析到位,而且图文并茂,很容易让人理解一个死循环是怎么产生的. 在博文中,耗子叔叔分析的最重要的一点就是 ...

  5. Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略

    Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...

  6. java hashmap 去重复_为什么我在Java HashMap中得到重复的键?

    本问题已经有最佳答案,请猛点这里访问. 我似乎在标准Java HashMap中得到重复的键."重复"是指键的equals()方法相等.这是有问题的代码: import java.u ...

  7. 【视频】详解Scala中的类及与Java的详细区别

    详解Scala中的类及与Java的详细区别

  8. java散列法的运用实例,Java HashMap compute() 使用方法及示例

    Java HashMap compute() 使用方法及示例 Java HashMap compute()方法计算一个新值,并将其与哈希映射中的指定键相关联. compute()方法的语法为: has ...

  9. Java HashMap 遍历方式性能探讨

    转载自 Java HashMap 遍历方式性能探讨 关于HashMap的实现这里就不展开了,具体可以参考JDK7与JDK8中HashMap的实现 JDK8之前,可以使用keySet或者entrySet ...

最新文章

  1. 心得丨机器学习自学指南(覆盖各个阶段的心得体会哦)
  2. 《怪物猎人》战斗核心设计分析
  3. Exchange Server2010系列之七:多邮箱搜索找出神秘邮件的幕后黑手
  4. 不小心把硬盘摔了一下,结果电脑变成这样了......
  5. C++学习之路 | PTA乙级—— 1091 N-自守数 (15 分)(精简)
  6. 消息队列属性及常见消息队列介绍
  7. Active MQ 传输 ObjectMessage 异常
  8. 老罗Android开发视频教程 打包下载地址,收集起来,给大家下载
  9. 关于luarocks
  10. VS2010 移除源文件又增加源文件,无法编译问题
  11. Mac Wireshark 设置中文
  12. sqlserver中执行顺序、TOP、PERCENT百分比、DISTINCT去掉重复值
  13. 共享充电宝方案怎么做
  14. springcould 微服务 nacos 跨域问题
  15. Guessing the Greatest (hard version)-(交互+二分+思维)
  16. 2018年回顾和收获
  17. 小程序中纯CSS实现仿京东小优惠券图标
  18. Hashtable用法
  19. 神奇宝贝java_我的世界下载 1.25神奇宝贝整合包_单机游戏下载
  20. iOS音频技术的研究-音频格式

热门文章

  1. 写给工程师的10条精进原则
  2. 2017派卧底去阿里、京东、美团、滴滴带回来的面试题
  3. 《四世同堂》金句摘抄(十一)
  4. 普里姆算法(修路问题)+图解
  5. Android增加自定义监听事件
  6. 完整的MIME类型列表
  7. java记录类型_Java中的记录类型
  8. spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入
  9. 琥珀ai_琥珀项目:Java的未来暴露
  10. java中使用jython_将Jython嵌入到您的Java代码库中