Java – HashMap详细说明
HashMap基于哈希算法工作,根据Java文档HashMap具有以下四个构造函数,
建设者 | 描述 |
---|---|
HashMap ()
|
构造一个空的 具有默认初始容量(16)和默认加载因子(0.75)的 HashMap 。
|
HashMap (int initialCapacity)
|
构造一个空的 具有指定初始容量和默认加载因子(0.75)的 HashMap 。
|
HashMap (int initialCapacity,
|
构造一个空的 具有指定初始容量和负载因子的 HashMap 。
|
HashMap ( Map <? extends K ,? extends V > m)
|
构造一个新的HashMap 具有与指定相同的映射Map 。
|
让我们编写一个简单的Java程序,以检查Map在内部如何工作
- 创建一个简单的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详细说明相关推荐
- 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 ...
- java HashMap的使用
java HashMap的使用 import java.util.HashMap; import java.util.Iterator; public class WpsklHashMap { pub ...
- Java HashMap工作原理深入探讨
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道 HashMap内部如何工作呢?几天前,我阅读了java.util.H ...
- Java HashMap的死循环的启示
在酷壳上看到博主陈皓写的最新文章疫苗:Java HashMap的死循环.博主看问题非常透彻,代码分析到位,而且图文并茂,很容易让人理解一个死循环是怎么产生的. 在博文中,耗子叔叔分析的最重要的一点就是 ...
- Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略
Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...
- java hashmap 去重复_为什么我在Java HashMap中得到重复的键?
本问题已经有最佳答案,请猛点这里访问. 我似乎在标准Java HashMap中得到重复的键."重复"是指键的equals()方法相等.这是有问题的代码: import java.u ...
- 【视频】详解Scala中的类及与Java的详细区别
详解Scala中的类及与Java的详细区别
- java散列法的运用实例,Java HashMap compute() 使用方法及示例
Java HashMap compute() 使用方法及示例 Java HashMap compute()方法计算一个新值,并将其与哈希映射中的指定键相关联. compute()方法的语法为: has ...
- Java HashMap 遍历方式性能探讨
转载自 Java HashMap 遍历方式性能探讨 关于HashMap的实现这里就不展开了,具体可以参考JDK7与JDK8中HashMap的实现 JDK8之前,可以使用keySet或者entrySet ...
最新文章
- 心得丨机器学习自学指南(覆盖各个阶段的心得体会哦)
- 《怪物猎人》战斗核心设计分析
- Exchange Server2010系列之七:多邮箱搜索找出神秘邮件的幕后黑手
- 不小心把硬盘摔了一下,结果电脑变成这样了......
- C++学习之路 | PTA乙级—— 1091 N-自守数 (15 分)(精简)
- 消息队列属性及常见消息队列介绍
- Active MQ 传输 ObjectMessage 异常
- 老罗Android开发视频教程 打包下载地址,收集起来,给大家下载
- 关于luarocks
- VS2010 移除源文件又增加源文件,无法编译问题
- Mac Wireshark 设置中文
- sqlserver中执行顺序、TOP、PERCENT百分比、DISTINCT去掉重复值
- 共享充电宝方案怎么做
- springcould 微服务 nacos 跨域问题
- Guessing the Greatest (hard version)-(交互+二分+思维)
- 2018年回顾和收获
- 小程序中纯CSS实现仿京东小优惠券图标
- Hashtable用法
- 神奇宝贝java_我的世界下载 1.25神奇宝贝整合包_单机游戏下载
- iOS音频技术的研究-音频格式