hashmap java_Java – HashMap详细说明
hashmap java
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
hashmap java
hashmap java_Java – HashMap详细说明相关推荐
- HashMap 源码详细分析(JDK1.8)
1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...
- HashMap 源码详细分析(JDK1.8) 1
1.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值, ...
- HashMap嵌套HashMap 的 案例
第一步:首先创建三个HashMap集合. 以学校制度为案例(学校 - 班级 - 学生): HashMap<Student,String> hm1 = new HashMap<> ...
- Hashmap 面试题 + Hashmap 原理 + Hashmap 源码(史上最全)
HashMap作为我们日常使用最频繁的容器之一,相信你一定不陌生了.今天我们就从HashMap的底层实现讲起,深度了解下它的设计与优化. 常用的数据结构 我在05讲分享List集合类的时候,讲过Arr ...
- java hashmap value_Java HashMap values() 方法
values() 方法返回映射中所有 value 组成的 Set 视图. 语法 values() 方法的语法为: hashmap.values() 注:hashmap 是 HashMap 类的一个对象 ...
- 第三次学JAVA再学不好就吃翔(part94)--HashMap嵌套HashMap
学习笔记,仅供参考,有错必纠 HashMap嵌套HashMap 没啥好说的,直接看代码. 输入: package com.guiyang.bean;import java.util.HashMap;p ...
- hashmap clone_Java HashMap clone()方法与示例
hashmap clone HashMap类clone()方法 (HashMap Class clone() method) clone() method is available in java.u ...
- Java之HashMap系列--HashMap扩容的原理
原文网址:Java之HashMap系列--HashMap扩容的原理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的HashMap是如何扩容的. 重要大小 类 初始容量 最大容量 扩容 ...
- HashMap/HashMap存储/HashMap扩容
HashMap Java 集合,也称作容器,主要是由两大接口 (Interface)派生出来的:Collection 和 Map. Map集合体系: Map集合特点: (1) 键值对存储(key-va ...
最新文章
- MySQL面试题 | 附答案解析(十一)
- Oracle监听配置
- python对象不接受参数什么意思___new\=TypeError:object()不接受参数
- Asp.Net 创建MetaWeblog API
- springcloud 相同服务名_SpringCloud系列之SpringCloud Stream
- python列表转换成数字_python 字母转成数字Python操作列表的常用方法总结
- 互联网日报 | 2021年春运火车票今起开抢;好未来达成33亿美元私人配售协议;盒马mini开进菜场...
- uboot命令及内核启动参数
- java接收ajax上传文件_使用ajax方式上传文件
- 《嵌入式 – GD32开发实战指南》第15章 低功耗(电源管理)
- 常见反爬虫方法及其应对策略
- 全球云服务商是怎么排名的?国内云主机市场占有率份额排行对比
- mysql7.6安装_CentOS7.6离线安装MySql5.7
- linux访问网络图片,linux网络图形监控方法
- github提交时报错:remote: Support for password authentication was removed on August 13, 2021问题解决方案
- \t\t【团队精神】荣辱与共 交流分享 精诚协作 尊重理解 ——程序员应知
- RTL8812F/RTL8197F修改beacon间隔
- 装个JCreator+JDK文档
- Android Kotlin + 协程 + Retrofit + MVVM优雅的实现网络请求(简洁!!!!)
- 弃百万年薪加入创业期阿里拿500元,他证明选择和努力同样重要
热门文章
- [2.7]【CF933A】A Twisty Movement【CF926B】Add Points【CF917A】The Monster【CF919E】Congruence Equation
- P6623-[省选联考2020A卷]树【Trie,树上启发式合并】
- P5135-painting【组合数学】
- 【2018.4.14】模拟赛之一-ssl2391 数列
- 【2018.3.24】模拟赛之三-ssl2547 圆环【数论】
- HDU1812 - Count the Tetris
- 一道有趣的最短路 NEERC2017 Journey from Petersburg to Moscow
- 16、mysql中函数的创建和使用
- 13、字符集和字符编码
- K8S Learning(2)——集群环境搭建