Java面试必问(1):HashMap相关问题
程序员文章站
2022-06-04 23:17:01
...
1、你用过HashMap吗?什么是HashMap?你为什么用到它?
HashMap是基于哈希表的Map接口的非同步实现,
它允许null键和null值,
且HashMap依托于它的数据结构的设计,存储效率特别高。
2、你知道HashMap的工作原理吗?你知道HashMap的get()方法的工作原理吗?
HashMap是基于hash算法实现的,
通过put(key,value)存储对象到HashMap中,
也可以通过get(key)从HashMap中获取对象。
当我们使用put的时候,首先HashMap会对key的hashCode()的值进行hash计算,
根据hash值得到这个元素在数组中的位置,将元素存储在该位置的链表上。
当我们使用get的时候,首先HashMap会对key的hashCode()的值进行hash计算,
根据hash值得到这个元素在数组中的位置,将元素从该位置上的链表中取出。
3、当两个对象的hashcode相同会发生什么?
hashcode相同,说明两个对象HashMap数组的同一位置上;
接着HashMap会遍历链表中的每个元素,通过key的equals方法来判断是否为同一个key;
如果是同一个key,则新的value会覆盖旧的value,并且返回旧的value。
如果不是同一个key,则存储在该位置上的链表的链头
4、如果两个键的hashcode相同,你如何获取值对象?
遍历HashMap链表中的每个元素,并对每个key进行hash计算,
最后通过get方法获取其对应的值对象
5、如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?
负载因子默认是0.75,HashMap超过了负载因子定义的容量,
也就是说超过了(HashMap的大小*负载因子)这个值,
那么HashMap将会创建为原来HashMap大小两倍的数组大小,
作为自己新的容量,这个过程叫resize或者rehash
6、你了解重新调整HashMap大小存在什么问题吗?
多线程的情况下,可能产生条件竞争。
当重新调整HashMap大小的时候,确实存在条件竞争,
如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。
在调整大小的过程中,存储在链表中的元素的次序会反过来,
因为移动到新的数组位置的时候,HashMap并不会将元素放在LinkedList的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。
如果条件竞争发生了,那么就死循环了。
7、我们可以使用自定义的对象作为键吗?
可以,只要它遵守了equals()和hashCode()方法的定义规则,
并且当对象插入到Map中之后将不会再改变了。
如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,
因为当它创建之后就已经不能改变了。
上一篇: 23种设计模式----适配器模式
下一篇: 前端面试必问题