今天去面试了一下,被问到hashmap的实现原理。 在网上查看了一下,并且配合源代码。现总结如下:
hashmap 采用的是数组加链表的方式进行存储的, 定义了一个内部类entry, 里面存了4个值。我们在put的是,会根据key去计算hash值,把值放到数组对应的下标上去。 如果hash值相同了,则使用链式存储,把值存在他的next中。 取出的时候会根据key的hash值去对应下标去取值出来。这样就会很快速的取出对应的值了。jdk1.8中还增加当我们恰好要根据key寻找一个在链表上的对象的时候,就涉及到遍历链表,逐个调用key对象的equals方法来比对我们要查找的到底是哪个键值对了。可想当链表的长度越长,匹配的时间复杂度就越高,和链表的长度成正比。这也就是HashMap内部实现时会根据链表的长度超过限定的阈值时,会将链表结构转换为红黑树结构,用来提升查询性能。replacementTreeNode方法就是此时被调用。TreeNode类也就是红黑树的节点对象。