以前很少有阅读源码的习惯。最近开始有跳槽的打算,那天鼓起勇气去面了SOHU,然后很自然地被鄙视了。
真是沉睡太久。真心要开始努力了。
话不多说。今天要总结 的一个是那天的面试题之一。HASHMAP的结构分析。
其实一开始看这题心里就有点心虚了。除了那个地球人都知道的KEY-VALUE以外,真心无别知识点可写。
回来后,看了下JDK.加上那天那个面试官解说的,终于算是有了个大概的理解。
实际上HASHMAP是一个ENTRY的数组的结构。而ENTRY又是一个链表结构的东东。这也不难理解,以前调试的时候 ,看HASHMAP的结构有时总会有一个NETRY的NEXT连着一个ENTRY。现在算明白了。原来是这么回事。
还有几个要点。
1。HASHMAP是可以放NULL作为KEY值 的,放NULL的时候 ,就把其HASH值 作为0来算。
2。PUT(KEY,VALUE)这个方法是在放进KEY时,根据KEY的HASH值算得所在数组位,再在这个位置插入(之所以说插入是因为每个位置上都是链表结构)。
3。如果你在构造HASHMAP时不指定好默认数组参数大小,HASHMAP会提供默认的数据大小。还有一个代码空间值 的loadFactor,用于决定HASHMAP的空间排布复杂情况的。前面有介绍到HASHMAP的实际结构实际上就是一个链表数组,而放进来的数据KEY,VALUE,是根据KEY的HASH值取一个算法来记算其所在数组中的位置的。在取得位置时就是顺插入链表中。而因为在HASHMAP中的算法是当所放元素个数大于某个值后,就要加大数组位数,而这个值就是由loadFactor*当前数组位数决定 的。loadFactor越大,链表结构有可能越深。
4。REMOVE方法实际上与PUT对应,由HASH值算得所在数组位置,再从依次遍历链表删除 结构。