数组,链表,哈希表的区别
-
数组 : 连续的一片连续的存储空间 , 占用内存严重 , 故空间复杂度高, 寻址容易 ,但是插入和删除困难 -
链表 : 存储空间松散 , 占用内存宽松 , 通过指针关联前后位置元素, 所以空间复杂度小 , 寻址困难 , 但是插入和删除比较快 -
哈希表 : 结合了数组和链表 , 结合了数组和链表两者的特点
- 元素存储到哈希表底层数组中的位置: index = key.hash() & (len - 1)
HashMap是一个线性数组 , 内部由Entry对象组成 , 每一个Entry对象包括了: key(键 — > 也称之为关键码值) , value(值 --> 真正的数据) , hashCode(hash码值) , next(指针域 --> 指向下一个元素)
- 注意: HashMap中可以存储null值, key为null值的元素放在数组下标为0的位置对应的链表中
解决Hash冲突的四种方法:
- 开放定址法:
开放定址法就是一旦发生了冲突之后就去寻找下一个空的散列地址, 只要散列表足够的, 空的散列地址总能找到, 找到之后就将其录入, 容易发生聚集
- 再Hash(哈希)法
再哈希法又叫做双哈希法 , 有多个不同的Hash函数, 当发生了hash冲突的时候, 使用第二个,第三个 …等哈希函数, 计算地址, 直到无冲突,不容易发生聚集,但是增加了计算的时间
- 链地址法
每个哈希表结点都有一个next指针, 多个哈希表结点的位置冲突时就将冲突的多个节点合在一起构成一个单向链表 , 被分配到同一个索引上的多个节点可以使用这个单向链表连接起来
- 建立公共溢出区
将哈希表分为基本表和溢出表两部分,但凡是和基本表发生了冲突的元素我们都填入到溢出表中
|