欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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中之后将不会再改变了。
如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,
因为当它创建之后就已经不能改变了。