https://www.javainterviewpoint.com/hashmap-works-internally-java/

How a HashMap Works internally has become a popular question in almost all the interview. As almost everybody knows how to use a HashMap or the difference between HashMap and Hashtable. But many fails when the question is how does a hashmap internally works.

So the answer to the question how does a hashmap works is that is it works based on the hashing principle but it is not as simple as it sounds. Hashing is the mechanism of assigning the unique code to a variable or attribute using some algorithm to enable easy retrieval. A true hashing mechanism should always return the same hashCode() when it is applied to the same object.

Then comes the question how does hashing help in storing and retrieving the value in HashMap. Many answers the value will be stored in the bucket and retrieved using the key if you think that is how it works then you are absolutely wrong.  To prove let’s take a look at the hashmap class.

     /**
* The table, resized as necessary. Length MUST always be a power of two.
*/
transient Entry[] table;

So what is the use of Entry[] in a hashmap? Because the HashMap stores the Objects as Entry instances, not as key and value

What is Entry Class?

The HashMap has an inner class called as Entry Class which hold the key, value stuff. And there is something called as next, hash which you will get to know a bit later.

 static class Entry<K,V> implements Map.Entry<K,V>
{
final K key;
V value;
Entry<K,V> next;
final int hash;
........
}

As of now, you know that the hashmap stores the Entry instances in an array and not as a key,value pairs. In order to store a value you will use the put() method of the hashmap, so now let’s dig into that and see how it works.

how put() method works internally ?

The Code implementation of the put method will be like below

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;
}
  • First, it checks for the if the key given is null or not, if the given key is null it will be stored in the ‘0’th position as the hashcode of null will be zero.
  • Then it applies the hashcode to the key.hashCode() by calling the hashcode method. In order to get the value within the limits of an array the hash(key.hashCode())is called which does some shifting operations to the hashcode.
  • The indexFor() method is used to get the exact location to store the Entry object.
  • Then comes the most important part what happens if two different object has the same hashcode( eg : Aa,BB will have the same hashcode) and will it be stored in the same bucket. To handle this let’s think of the LinkedList in data structure it will have a next attribute which will always point to the next object . The same way the next attribute in the Entry class points to the next object. Using this different objects with the same hashcode will be placed next to each other.
  • In the case of the Collision , the HashMap checks for the value of the next attribute if it is null it inserts the Entry object in that location , if next attribute is not null then it keeps the loop running till next attribute is null then stores the Entry object there.

How duplicate key is prevented in hashmap ?

As we all know hashmap doesn’t allow duplicates in the key even though we insert the same key with different values the latest value only is returned.

import java.util.HashMap;
import java.util.Map; public class HashMapEg
{
public static void main(String[] args)
{
Map map = new HashMap();
map.put(1,"sam");
map.put(1,"Ian");
map.put(1,"Scott");
map.put(null,"asdf"); System.out.println(map); } }

For the above code, you will get the output as {null=asdf, 1=Scott}  as the values sam,Ian will be replaced by Scott , So how does this happen.

All the Entry Objects in the LinkedList will have the same hashcode but hashmap uses  equals () method checks the equality if key.equals(k) is true then it will replace the value object inside the Entry class and not the key. So this way it prevents the duplicate key being inserted.

how get() method works internally ?

It is almost the same logic as applied in put will be used to retrieve the value.

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;
}
  • First, it gets the hashcode of the key object which is passed and finds the bucket location.
  • If the correct bucket is found it returns the value (e.value)
  • If no match is found it returns null.

What happens if two keys have the same hashcode?

The same collision resolution mechanism will be used here  key.equals(k)  will check until it is true, if true it returns the value of it.

Hope this article clarifies the troublesome HashMap internal mechanism. Happy Learning !!

How HashMap works in Java的更多相关文章

  1. How HashMap works in java 2

    https://www.javacodegeeks.com/2014/03/how-hashmap-works-in-java.html   Most common interview questio ...

  2. HashMap如何工作 - Java

    大多数人应该会同意HashMap是现在面试最喜欢问的主题之一.我和同事常常进行讨论,并很有帮助.现在,我继续和大家讨论. 我假设你对HashMap的内部工作原理感兴趣,并且你已经知道了基本的HashM ...

  3. SpringMvc中Hashmap操作遇到 java.util.ConcurrentModificationException: null

    代码按照网上修改为类似,还不能解决问题 for (Iterator<String> it = target.keySet().iterator(); it.hasNext(); ) { i ...

  4. HashTable HashMap HashSet区别(java)

    Hashtable: 1. key和value都不许有null值 2. 使用enumeration遍历 3. 同步的,每次只有一个线程能够访问 4. 在java中Hashtable是H大写,t小写,而 ...

  5. HashMap如何在Java中工作?

    通过优锐课学习笔记分享,我们可以看到HashMap问题在工作面试中很常见. 这也是HashMaps在Java内部如何工作的一些深入说明,分享给大家参考学习. HashMap在内部如何工作已成为几乎所有 ...

  6. JSONObject JSONArray json字符串 HashMap ArryList 在java开发中用到的数据结构

    1.JSONObject  长成这样的:   { "key1":value1, "key2":value2, "key3":value3} ...

  7. Understanding How Graal Works - a Java JIT Compiler Written in Java

    https://chrisseaton.com/truffleruby/jokerconf17/ https://chrisseaton.com/truffleruby/tenthings/ http ...

  8. LRU hashMap(拉链) + 双向链表 java实现

    //基于 hash (拉链法) + 双向链表,LRUcache //若改为开放寻址,线性探测法能更好使用cpuCache public class LRU { private class Node { ...

  9. Java集合框架(Collection Framework)学习之 HashMap

    从API文档可以得到HashMap的以下几个特点: 基于哈希表(hash table)实现,并且是链式哈希表 允许空值和空键(null=null 键值对) HashMap与Hashtable基本相同, ...

随机推荐

  1. php的一个验证邮箱的正则表达式

    /([a-z0-9]*[-_\.]*[a-z0-9]+)*[-_\.]*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.]([a-z0-9]{2,3}|[a-z0-9]*[-_]?[a-z ...

  2. Maven Debug

    1.在pom.xml中新增plugin <plugin>   <groupId>org.mortbay.jetty</groupId>   <artifact ...

  3. jquery ajax abort()方法

    如果用户频繁点击ajax请求,除最后一个外都是无效的,趁早结束节省资源.也可能出现更严重的问题,最后一个发送的请求,响应未必是最后一个,有可能造成混乱.用jquery的abort方法,可以中途中止aj ...

  4. 通过wireshark抓包来讲解HTTP中Connection: keep-alive头部的作用

    今天周末时间,有空给大家讲解一个小知识点,即HTTP的keep-alive头部.我使用wireshark来抓取网络包来在实战中讲解.希望能让大家更容易.更直观的理解! HTTP中keep-alive头 ...

  5. CUBA China 最新进展

    各位关注CUBA平台的朋友,你们好! 距上次发布动态我们又沉默了大概两个月时间,这期间我们一直在翻译CUBA平台的文档.CUBA平台的开发文档相当丰富,所以这需要耗费较多的时间,至少比我们预想的时间要 ...

  6. 在百度搜索里展现网站LOGO

    我们经常在百度搜索一些网站可以看到一个网站在百度上展示的三个部分: 网站的名称 如(趣学车) 网站的描述 一段比较详细的对网站的介绍 网站的logo,一张logo图片 如下图 ------ 接下来我们 ...

  7. vs2013中,自定义mvc 添加视图脚手架

    参考文章: http://weblogs.asp.net/imranbaloch/archive/2013/09/15/customizing-the-asp-net-mvc-5-web-api-2- ...

  8. [javaSE] 数组(查找-二分查找)

    前提数组必须是有序的 定义最小,最大,中间的角标索引 int min,max,mid; min=0; max=arr.length-1; mid=(min+max)/2; 上面的索引需要变化,使用循环 ...

  9. Recommend ways to overwrite hashCode() in java

    Perface In the former chapter, I talk about topics about hashCode, And I will continue to finish the ...

  10. Go 中包导入声明

    Go中的程序由软件包组成.通常,软件包依赖于其他软件包,或者内置于标准库或第三方的软件包.包需要先导入才能使用其导出的标识符.本文将翻译一篇国外的文章,用于介绍包导入的原理以及几种常用的导入方式. & ...