前言
大家好,我是春风。
hashmap经常会被作为我们面试的热身问题。当你讲完自我介绍,面试官上下翻看着你的简历,余光还瞟一眼你的状态和形象。
入定,面试官淡淡的说出:请简单讲一下hashmap?或者你理解的hashMap?
其实这种泛泛的问法一般是考验面试者的逻辑能力和表述能力,你是否能有条不紊的讲出hashmap的结构,put大致流程等等,回答时除了流程清晰,我们也可以稍微带一点源码上的理解,来体现我们的深度。
当然很多情况下,你自己不体现,那面试官会帮你体现~
这就是接下来通常会问的hashmap底层原理了,底层原理一般就是揪着源码不放,但是hashmap的源码并不复杂,
重点就是put方法,而put方法又包含初始化表格、寻址、存数、扩容。
那在这些源码中,面试官一般最想听的,也最能体现我们深度的就是这些关键代码中频繁出现的位运算。恰恰hashmap的精妙也就在于这些位运算的设计。
下图是我总结的hashmap面试的重点:
为什么要频繁使用位运算?
因为位运算是机器码层面的操作,具有得天独厚的性能优势。毕竟任何花里胡哨的事物在我们的计算机里都是一串01的二进制码,直接对这串二进制码做运算会来的更加简单高效。
下面我们就一一来说下,hashmap中有哪些精妙的位运算呢?其实理解完这些位运算后,你对hashmap的整体设计也会有一个更深更全面的认识。
一、容量计算
在说容量计算之前,我们需要先复习一个知识点,hashmap的结构:数组+链表+红黑树,而我们这里的容量计算的并不是全部元素的容量,而是其中数组table的大小。
当我们每次new