让你设计一个 HashMap ,怎么设计?
让你设计一个 HashMap ,怎么设计?
这个问题我觉得可以从 HashMap 的一些关键点入手,例如 hash函数、如何处理冲突、如何扩容。
可以先说下你对 HashMap 的理解。
比如:HashMap 无非就是一个存储 <key,value> 格式的集合,用于通过 key 就能快速查找到 value。
基本原理就是将 key 经过 hash 函数进行散列得到散列值,然后通过散列值对数组取模找到对应的 index 。
所以 hash 函数很关键,不仅运算要快,还需要分布均匀,减少 hash 碰撞。
而因为输入值是无限的,而数组的大小是有限的所以肯定会有碰撞,因此可以采用拉链法来处理冲突。
为了避免恶意的 hash 攻击,当拉链超过一定长度之后可以转为红黑树结构。
当然超过一定的结点还是需要扩容的,不然碰撞就太严重了。
而普通的扩容会导致某次 put 延时较大,特别是 HashMap 存储的数据比较多的时候,所以可以考虑和 redis 那样搞两个 table 延迟移动,一次可以只移动一部分。
不过这样内存比较吃紧,所以也是看场景来 trade off (权衡)了。
不过最好使用之前预估准数据大小,避免频繁的扩容。
基本上这样答下来差不多了,HashMap 几个关键要素都包含了,接下来就看面试官怎么问了。
可能会延伸到线程安全之类的问题,反正就照着 currentHashMap 的设计答。
Comments