java中hashmap_HashMap如何在Java中工作

java中hashmap

面试中最常见的问题是“ HashMap如何在Java中工作”,“ HashMap的获取和放置方法如何在内部工作”。 在这里,我试图通过一个简单的示例来解释内部功能。 而不是通过理论,我们将首先从示例开始,以便您可以更好地理解,然后我们将了解get和put函数如何在Java中工作。
让我们举一个非常简单的例子。 我有一个Country类,我们将使用Country类对象作为键,并使用其大写名称(字符串)作为值。 下面的示例将帮助您了解如何将这些键值对存储在哈希图中。

1. Country.java

package org.arpit.javapostsforlearning;
public class Country {String name;long population;public Country(String name, long population) {super();this.name = name;this.population = population;}public String getName() {return name;}public void setName(String name) {this.name = name;}public long getPopulation() {return population;}public void setPopulation(long population) {this.population = population;}// If length of name in country object is even then return 31(any random number) and if odd then return 95(any random number).// This is not a good practice to generate hashcode as below method but I am doing so to give better and easy understanding of hashmap.@Overridepublic int hashCode() {if(this.name.length()%2==0)return 31;else return 95;}@Overridepublic boolean equals(Object obj) {Country other = (Country) obj;if (name.equalsIgnoreCase((other.name)))return true;return false;}}

如果您想了解有关对象的哈希码和equals方法的更多信息,可以在Java中引用hashcode()和equals()方法。

2. HashMapStructure.java(主类)

import java.util.HashMap;
import java.util.Iterator;public class HashMapStructure {/*** @author Arpit Mandliya*/public static void main(String[] args) {Country india=new Country("India",1000);Country japan=new Country("Japan",10000);Country france=new Country("France",2000);Country russia=new Country("Russia",20000);HashMap<country,string> countryCapitalMap=new HashMap<country,string>();countryCapitalMap.put(india,"Delhi");countryCapitalMap.put(japan,"Tokyo");countryCapitalMap.put(france,"Paris");countryCapitalMap.put(russia,"Moscow");Iterator<country> countryCapitalIter=countryCapitalMap.keySet().iterator();//put debug point at this linewhile(countryCapitalIter.hasNext()){Country countryObj=countryCapitalIter.next();String capital=countryCapitalMap.get(countryObj);System.out.println(countryObj.getName()+"----"+capital);}}} 
</country></country,string></country,string>

现在,在第23行放置调试点,然后右键单击project-> debug as-> java应用程序。 程序将在第23行停止执行,然后右键单击countryCapitalMap,然后选择watch。您将看到以下结构。

HashMapStructure1 现在,从上图可以观察到以下几点

  1. 有一个称为table的Entry []数组,其大小为16。
  2. 该表存储Entry类的对象。 HashMap类具有一个称为Entry的内部类。此Entry具有键值作为实例变量。 让我们看一下入口类的结构Entry Structure。
  3. static class Entry implements Map.Entry
    {final K key;V value;Entry next;final int hash;...//More code goes here
    }
  4. 每当我们尝试将任何键值对放入哈希图中时,都会为键值实例化Entry类对象,并且该对象将存储在上述Entry [](表)中。 现在您一定想知道,上面创建的Enrty对象将存储在哪里(表中的确切位置)。 答案是,通过调用Hascode()方法为密钥计算哈希码。 该哈希码用于计算上述Entry []表的索引。
  5. 现在,如果您在上图中的数组索引10处看到,它具有一个名为HashMap $ Entry的Entry对象。
  6. 我们在hashmap中放置了4个键值,但似乎只有2个!!!因为这是因为如果两个对象具有相同的哈希码,则它们将存储在相同的索引处。 现在问题出现了如何? 它以LinkedList的形式存储对象(逻辑上)。

那么如何计算上述国家/地区键值对的哈希码。

Hashcode for Japan = 95 as its length is odd.
Hashcode for India =95 as its length is odd
HashCode for Russia=31 as its length is even.
HashCode for France=31 as its length is even.

下图将清楚地说明LinkedList概念。

HashMapStructure2 因此,现在,如果您对哈希图结构有很好的了解,那么让我们通过put和get方法。

放置:

让我们看一下put方法的实现:

/*** Associates the specified value with the specified key in this map. If the* map previously contained a mapping for the key, the old value is* replaced.** @param key*            key with which the specified value is to be associated* @param value*            value to be associated with the specified key* @return the previous value associated with <tt>key</tt>, or <tt>null</tt>*         if there was no mapping for <tt>key</tt>. (A <tt>null</tt> return*         can also indicate that the map previously associated*         <tt>null</tt> with <tt>key</tt>.)*/public V put(K key, V value) {if (key == null)return putForNullKey(value);int hash = hash(key.hashCode());int i = indexFor(hash, table.length);for (Entry<k , V> 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;e.recordAccess(this);return oldValue;}}modCount++;addEntry(hash, key, value, i);return null;}

现在让我们逐步了解上面的代码

  1. 检查键对象是否为空。 如果key为null,则它将存储在table [0]中,因为null的哈希码始终为0。
  2. 调用关键对象的hashcode()方法并计算哈希码。 该哈希码用于查找用于存储Entry对象的数组的索引。 有时可能会发生这种哈希代码函数编写不佳的情况,因此JDK设计人员放置了另一个名为hash()的函数,该函数将以上计算的哈希值作为参数。如果您想了解更多有关hash()函数的信息,可以引用hash和indexFor hashmap中的方法 。
  3. indexFor(hash,table.length)用于计算表数组中的确切索引,以存储Entry对象。
  4. 正如我们在示例中看到的那样,如果两个关键对象具有相同的哈希码(称为冲突 ),则它将以链表的形式存储。因此在这里,我们将遍历链表。
  • 如果我们刚刚计算出的那个索引上没有元素,那么它将直接将Entry对象放在那个索引上。
  • 如果该索引处存在元素,则它将迭代直到获得Entry-> next为null。然后当前的Entry对象成为该链表中的下一个节点
  • 如果我们再次放置相同的密钥,从逻辑上讲应该替换旧值该怎么办。 是的,它将这样做。在迭代时将通过调用equals()方法( key.equals(k) )检查键是否相等,如果此方法返回true,则它将值对象替换为当前Entry的值对象。

得到:

让我们看一下get get的实现:

/*** Returns the value to which the specified key is mapped, or {@code null}* if this map contains no mapping for the key.** <p>* More formally, if this map contains a mapping from a key {@code k} to a* value {@code v} such that {@code (key==null ? k==null :* key.equals(k))}, then this method returns {@code v}; otherwise it returns* {@code null}. (There can be at most one such mapping.)** </p><p>* A return value of {@code null} does not <i>necessarily</i> indicate that* the map contains no mapping for the key; it's also possible that the map* explicitly maps the key to {@code null}. The {@link #containsKey* containsKey} operation may be used to distinguish these two cases.** @see #put(Object, Object)*/public V get(Object key) {if (key == null)return getForNullKey();int hash = hash(key.hashCode());for (Entry<k , V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k)))return e.value;}return null;}

当您了解了hashmap的put功能时。 因此,了解获取功能非常简单。 如果传递任何键以从哈希图获取值对象。

  1. 检查键对象是否为空。 如果key为null,则将返回Object的值位于table [0]。
  2. 调用关键对象的hashcode()方法并计算哈希码。
  3. indexFor(hash,table.length)用于使用生成的哈希码来获取Entry对象来计算表数组中的精确索引。
  4. 在表数组中获取索引后,它将遍历链表并通过调用equals()方法检查键是否相等,如果返回true,则返回Entry对象的值,否则返回null。

记住要点:

  • HashMap有一个称为Entry的内部类,用于存储键值对。
  • 上面的Entry对象存储在称为table的Entry [](Array)中
  • 表的索引在逻辑上称为存储桶,它存储链表的第一个元素
  • 关键对象的hashcode()用于查找该Entry对象的存储桶。
  • 如果两个键对象具有相同的哈希码,则它们将进入表数组的同一存储桶中。
  • 关键对象的equals()方法用于确保关键对象的唯一性。
  • 完全不使用值对象的equals()和hashcode()方法

参考: HashMap如何在我们的JCG合作伙伴 Arpit Mandliya在Java框架和面向初学者博客的设计模式下在Java中工作 。

翻译自: https://www.javacodegeeks.com/2014/03/how-hashmap-works-in-java.html

java中hashmap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/342915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】国家开放大学2018年秋季 0014-21T秘书学(一) 参考试题

〖ZDA1(D〗 〖ZD)〗〖ZDA2(D〗 试题&#xff08;开卷&#xff09;〖ZD)〗〖ZDA3(D〗 (共6页)〖ZD)〗〖ZDA4(D〗 (共2页)〖ZD)〗〖ZDA8(D〗 2018—2019学年度第一学期期末考试〖ZD)〗〖ZDA9&#xff08;D〗 2019年1月〖ZD)〗 〖MQ(《1BW》D205mm。25mm(0,-38mm)-W〗〖BG&#xf…

LoRa、Sigfox和NB-IoT在物联网趋势中谁是你的最佳拍档?

无线通信技术是物联网的传输基础&#xff0c;随着智慧城市大应用成为热门发展&#xff0c;各种技术推陈出新&#xff0c;纷纷抢占物联网市场。在LPWAN技术里&#xff0c;最热门的莫过于LoRa、Sigfox和NB-IoT。在物联网趋势中&#xff0c;这三种技术各自具有什么优势?谁才会是你…

计算机教育影片观后感,2020青少年法治教育片沉重的爱观后感大全

2020青少年法治教育片沉重的爱观后感大全时间&#xff1a;2020-11-21 13:41:01 分类&#xff1a;读/观后感 | 2020青春正步走沉重的爱观后感 | Word文档下载2020青少年法治教育片沉重的爱观后感大全导语&#xff1a;做人是孩子的立身之本&#xff0c;欲使孩子成才&#xff0c…

电话光端机类型

通过之前的介绍&#xff0c;我们了解到电话光端机就是把传统的电话信号转换成光信号并在光纤上传输的设备&#xff0c;但是&#xff0c;电话光端机又是怎么分类的&#xff0c;具体有哪些类型呢&#xff1f;今天&#xff0c;飞畅科技的小编就来为大家详细介绍下电话光端机的类型…

【渝粤教育】国家开放大学2018年秋季 0109-21T公司财务 参考试题

科目编号&#xff1a;0161 座位号 2018&#xff0d;2019学年度第一学期期末考试 教师职业道德试题&#xff08;闭卷&#xff09; 2019年 1月 一、简答题 ( 每题10分&#xff0c;共30 分) 1&#xff0e;教师职业道德的功能有哪些&#xff1f; 2&#xff0e;当今我国教师职业…

在Java中使用Spliterator

介绍&#xff1a; Java中的迭代器用于遍历给定源的元素。 Java中的Spliterator是四个可用的Java迭代器之一 -Iterator &#xff0c;Enumeration&#xff0c; ListIterator和Spliterator 。 它是java.util包中可用的接口。 Spliterator最初是在Java 8中引入的&#xff0c;以支持…

Zigbee如何在智能家居中成为领先的连接技术?

ZigBee技术是一种近距离、低复杂度、低功耗、低速率、低成本的双向无线通讯技术。主要用于距离短、功耗低且传输速率不高的各种电子设备之间进行数据传输以及典型的有周期性数据、间歇性数据和低反应时间数据传输的应用。 ZigBee建立在802.15.4标准之上&#xff0c;它确定了可以…

计算机启动完成后操作系统负责管理的是,终极:如果计算机启动后无法进入系统,旧驱动程序会教您如何处理...

为什么计算机无法启动进入系统&#xff1f;如何解决开机后电脑无法进入系统的问题&#xff1f;以下编辑器将为您详细介绍如何解决启动后计算机无法进入系统的问题。众所周知&#xff0c;长时间使用计算机时&#xff0c;会出现一种或另一种问题。引导后无法进入系统的问题是最常…

【渝粤教育】国家开放大学2018年秋季 0267-21T摄影技术 参考试题

试卷编号&#xff1a;0273 座位号 2018——2019学年度第一学期期末考试 中国现代文学 试题 2019年1月 1&#xff0e;闻一多分别于1923年和1928年出版了两部诗集&#xff0c;第一部是《__________》&#xff0c;第二部是《___________》。 2&#xff0e;《__________》是鲁迅唯…

业界对物联网技术最常见的三大误区解读

各行各业都在借助数字化东风进行转型&#xff0c;制造业也不例外。智能工厂、大数据、物联网、人工智能……新兴技术在制造业领域焕发着巨大价值。然而对于物联网技术&#xff0c;很多企业依然抱有观望&#xff0c;甚至谨慎的态度。现在我们一起看看业界对这种技术的最常见误区…

【渝粤教育】国家开放大学2018年秋季 0434-22T高级英语口语 参考试题

科目编号&#xff1a;[0471] 座位号 2018-2019学年度第一学期期末考试 畜牧学 试题 2018年 11 月 一、名词解释&#xff08;本大题共5小题&#xff0c;每小题4分&#xff0c;共计20分&#xff09; 1.热增耗 2&#xff0e;能量饲料 3&#xff0e;胴体 4&#xff0e;同步发情…

电话光端机应用范围解析!电话光端机主要应用在哪些领域?

电话光端机刚进入安防领域时&#xff0c;称得上是当时的新贵。由于那时光纤通信的应用还未普及&#xff0c;别说行业内许多人没有看到过光端机&#xff0c;只怕没听说过的人也不在少数。那时候的光端机是十分昂贵的&#xff0c;因此也显得十分神秘。当然&#xff0c;它的性能优…

办公室文员计算机应用考试试题,办公室人员考试习题及答案.doc

办公室人员考试习题及答案一、文员办公室管理1&#xff0e;以下哪点不是办公室事务管理的特征A&#xff0e;服务性 B&#xff0e;决策性 C&#xff0e;专业性 D&#xff0e;主动性 A&#xff0e;准备一些敞开的文件夹&#xff0c;贴上相应的标识条B&#xff0e;办公桌抽屉物品要…

Zigbee费尽心思做mesh网究竟在智能家居中有什么用?

在物联网蓬勃发展的浪潮下&#xff0c;智能家居的热度也随之不断升温。由于智能家居的安全、节能、舒适、便利、高效等诸多特点&#xff0c;越来越多的客户开始接受和开发智能家居单品和系统。在中国推广Zigbee技术的这几年里&#xff0c;我有幸看到来自中国的厂家在物联网和智…

【渝粤教育】国家开放大学2018年秋季 0630-21T环境法学 参考试题

科目编号&#xff1a;0633 座位号&#xff1a; 2018-2019学年度第一学期期末考试 化工CAD试题 2019年1月 一、试题一&#xff08;本题50分&#xff09; 设置绘图环境并绘制如下图框标题栏并保存。 二、试题二&#xff08;本题50分&#xff09; 调用图框绘一个平面图形标注…

【渝粤教育】国家开放大学2018年秋季 0699-22T阅读与写作 参考试题

试卷编号&#xff1a;0704 2018——2019学年度第遗产学期期末考试 法律基础与实务 试题答案及评分标准 2019年1月 一、单项选择题&#xff08;每小题4分&#xff0c;共40分&#xff09; 1&#xff0e;B 2&#xff0e;A 3&#xff0e;D 4&#xff0e;B 5&#xff0e;C 6. A 7. B…

为什么要使用工业以太网交换机?

以太网技术得到很大的提高&#xff0c;并且被公司和大学办公室所接受&#xff0c;现在正逐步的拓展有更多需求的工业环境应用。工业以太网交换机的的吸引力包括监视数据传输&#xff0c;被用来建立和配置设备的现存实用工具 &#xff0c;还有可以从某个中心位置可以安装控制设备…

高低温湿热试验箱使用的注意事项

高低温湿热试验箱不要放在阳光直接照射或其他热源直接辐射的场所。不要放置在灰尘多、有腐蚀性或可燃性气体的环境中。不要放置在有振动的地方。不要离壁面太近&#xff0c;以免通风不良。应在环境温度15℃&#xff5e;35℃&#xff0c;相对湿度&#xff1a;不大于85%内使用。高…

计算机信息系统集成资质二级 列表6,计算机信息系统集成资质等级二级

计算机信息系统集成资质等级二级信息系统集成项目就是从客户和用户的需求出发&#xff0c;将硬件、系统软件、工具软件、网络、数据库及相关应用的应用软件集成为实用的信息系统的过程。系统集成的本质就是最优化的综合统筹设计&#xff0c;一个大型的综合计算机网络系统&#…

java生日快乐_Java八岁生日快乐!

java生日快乐这是又一次漫长的旅程&#xff0c;但是昨天&#xff0c;恰好是Java 7发布两年零七个月零十八天之后&#xff0c;我们现在有了可用于生产的构建 Java 8可供下载 &#xff01; 这个新的主要版本包含一些新功能和增强功能&#xff0c;这些功能和增强功能可以提高现有…