面试中的hashmap

Posted IT丶小农民

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中的hashmap相关的知识,希望对你有一定的参考价值。

我java开发有3年多了,辞职了准备新的发展,面试中总是离不开关于hashmap的问题,现在总结下有哪些问题?


HashMap和HashTable的区别?什么地方用到Hashmap?HashMap工作原理?一般要求你实现hashmap等等来考察你的能力。

1、什么事HashMap?什么地方用到HashMap?
我们的回答是按照键值对存储的容器,以及它的一些特性如key和value值允许null,通过getKey()来获取对应的value值,通过EntrySet()获取键值对的集合等。
这里我们会与hashtable比较

  • 继承类不同:hashmap继承AbstractMap;hashtable继承Dictionary
  • 执行效率不同:hashmap是非线程安全的,是hashtable的轻量级实现,效率较高;hashtable是线程安全的,效率低些
  • put方法对key和value的要求不同:hashmap允许Entry的key或value为null;hashtable不允许Entry的key或者value为null,否则出现NullPoniterException
  • 有无contains方法:hashmap没有contains方法;hashtable有contains方法。

2、java对hashmap如何实现的?

一般我们都会说通过键值对的形式保存需要存储的值。不过这并不是面试官要的答案,我们的仔细研究一二。

HashMap其实是一个线性的数据实现的,可以理解其存储数据的容器是一个线性数组,有人会疑问:线性数组怎么实现按照键值对来存取数据?接下来我们看看解释:
1、HashMap里面实现一个静态的内部Entry,其重要属性有key,value,next,hash,从key和value属性我们可以Entry就是hashmap键值对实现类的一个基础的bean,我们前面说的HashMap的基础是一个线性数组即使Entry[],Map里面的内容都保存在Entry[]里面。

2、既然是线性数组,为什么能够随机存取?这里是HashMap用的一个小算法,大致实现:
存储:
int hash = key.hashCode();每个key的hash是一个固定的int值。
int index = hash % Entry[].length;
Entry[index] = value;
取值:
int hash = key.hashCode();
int index = hash % Entry[].length;
return Entry[index];

通过上面我们轻松的理解了HashMap通过键值存取的基本原理了。

3、如果两个key通过hash % Entry[].length得到的index相同,会不会有覆盖的危险?

Entry类的next属性,作用指向下一个Entry。例如:第一个键值对应的A进来,通过key的hash计算得到index=1,记作Entry[1]=A,这时候又进来一个键值对B,通过key的hash计算index也是1,现在如何处理?HashMap的做法是B.next = A,Entry[1]=B,如果这是又来一个C对应的index也是1,那么C.next = B ,Entry[1] = C;这样我们发现index=1的地方其存取了A,B,C这三个键值对,通过next这个属性链接在一起(消除了我们的顾虑)。

本人研究的比较浅,抽时间继续研究,到这里HashMap大致的实现差不多了,关于hashmap的实例有两个参数影响其性能:初始容量加载因子。

以上是关于面试中的hashmap的主要内容,如果未能解决你的问题,请参考以下文章

HashMap与ConcurrentHashMap面试要点

Java面试小短文HashMap中的hash方法为什么要右移16位并异或?

Java面试小短文HashMap中的hash方法为什么要右移16位并异或?

Java面试小短文HashMap中的hash方法为什么要右移16位并异或?

HashMap源码刨析(面试必看)

Java面试题|为什么基本类型不能做为HashMap的键值?