面试中的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的主要内容,如果未能解决你的问题,请参考以下文章
Java面试小短文HashMap中的hash方法为什么要右移16位并异或?
Java面试小短文HashMap中的hash方法为什么要右移16位并异或?