哈希表是数组和单向链表的结合。
HashMap底层是个一维数组,每个数组存储的是一个静态类HashMap.Node。
Node里面有下一个Node的地址,相当于链表,还有哈希值,可以转换成数组的下标。
哈希表数据结构示意图:
在哈希表中查询相当于在字典中先找到对应字母的页,再在这些页中查找。
所以HashMap的key无序且不可重复,不一定挂在那个单向链表上,而且equals方法保证不重复
因为如果一个对象的hashCode方法导致哈希值分布不均匀,那么哈希表就得不到有效利用。
所以一般放入HashSet和HashMap的key的对象需要重写hashCode和equals方法。并且如果equals方法返回true,hashCode返回也必然是true
HashMap的默认初始容量16,默认加载因子0.75。
为了达到散列分布,提高效率,HashMap初始容量推荐为2的指数。
在JDK8以后,HashMap中如果单向链表元素超过8会变成红黑树,小于6会变成单向链表。