1、首先说一下数组结构,数组的存储区间是连续的,空间的复杂度比较大,所以会比较占用内存。
但寻址比较快,所以特点是:查询快速、操作困难。
2、再说一下链表结构,链表存储结构比较离散,空间的复杂度比较小,所以内存占用比较宽松。
但寻址比较麻烦,所以特点是:查询较慢、操作简单。
这两种存储结构是比较典型的两个极端,这时哈希表可以同时弥补他们的缺点。我们可以理解哈希表为:
把链表存储到数组中(数组+链表)
不爱画了,盗用一张网上的图片,哈哈 :
HashMap里面实现了一个静态内部类Entry,属性有 key , value和next, 哈希表每个元素存储的是链表的头结点。这些元素存储到数组中的规则一般是通过 hash(key)%len(元素的key的哈希值对数组长度取模) 定位。比如此哈希表中,10%12=10, 23%12=10。所以10和23都存储在数组下标为10的位置。
对第一个键值对A的存储,通过计算key的hash得到index=10,所以Entry[10] = A。对第二个键值对B的存储,通过计算B的index也等于10。HashMap操作是:B.next = A,Entry[10] = B。以此类推,这样我们会看到index=10的地方其实存取了A、B两个键值对,他们通过next链接在一起。也就是说数组中存储的是最后插入的元素,这就是HashMap的大致实现。