最近看面经发现很多人都遇到手写 HashMap 的场景。我们都知道 JDK1.7 和 JDK1.8 中的 HashMap 实现差别还是比较大的,主要是 JDK1.8中的 HashMap 引入了红黑树。那么面试过程中,应该不会让你手写红黑树的(我觉得),所以只需要掌握一个简单的 put、get、resize 方法即可。本文先写了 put 和 get 方法,其他方法后续再完善。
1、先新建 16个 桶即 bucket(16是源码默认的,可以自定义),给桶分别标上 1~16 标号;
2、put 一个键值对之后,用 key 的 hash 值对 16 取余,结果肯定也是一个 1~16 范围内的数值,把这对键值对放到取余后的值对应的那个的桶里(注意,不可能为每一个 hash 值都创建一个桶,那样的话代价太大,这里只创建了16个桶,所以很有可能一个桶里放入多个键值对。如果偏巧那个桶里是空的,直接把 key、value 放进去,如果桶不为空,就要一个一个比对桶里原有的 key 是否和现在要放进去的 key 是同一个(即 hash 值相同且 equals 为 true),如果是同一个,那么就用新的 value 覆盖替换原来的 value 就行,如果遍历完了,没有一个相同的 key,那么就放到所有 key 的最后面(jdk1.8之后是放在最前面ÿ