随手记录看过的面试题

1.HashMap在什么情况下会扩容,或者有哪些操作会导致扩容?

… 当HashMap中的元素越来越多的时候,hash冲突的几率也就越来越高,因为数组的长度是固定的。所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个操作也会出现在ArrayList中,这是一个常用的操作,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize。

…那么HashMap什么时候进行扩容呢?当HashMap中的元素个数超过数组大小loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过160.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,扩容是需要进行数组复制的,复制数组是非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。

2.HashMap检测到hash冲突后,将元素插入在链表的末尾还是开头?

首先要明白什么是hash冲突,不同的key有相同的hash值,这时就会出现hash冲突,发生冲突后,冲突的数据会存在这个Entry对应的链表上(即:Hash冲突后,那么HashMap的单个bucket里存储的不是一个 Entry,而是一个 Entry 链),冲突后会将元素插入在链表的开头

你可能感兴趣的:(随手记录看过的面试题)