哈希表

1.HashMap集合底层是一个哈希表/散列表数据结构

2.哈希表是一个数组和单项链表得结合体。数组在查询方面效率很高,随机增删效率低,而单向链表在随机增删方面效率高,在查询方面效率低,哈希表则将以上两种优点结合,充分发挥各自优点

3.HashMap底层源码
Public class HashMap{
Node <k , v> [] table ;
Static class Node <k,v>{
final int hash; //哈希值
final k key; //存储到Map集合中得Key
V value; //存储到Map集合中得value
Node<k,v> next; //下一个节点得内存地址
}
}

4.哈希表底层是一个一维数组,这个数组中得每一个元素是一个单向链表(数组和链表得结合体)

5.实现原理:
(a) map.put(k , v) 实现原理:
先将k,v封装到Node对象当中,底层会调用k得hashCode()方法得出哈希值,然后通过哈希算法将哈希值转换成一个数组下标,下标位置上如果没有元素,就把Node添加到这个位置上,如果下标对应位置上有链表,此时会拿着K和链表上的每一个节点中的k进行equals,如果所有得equals方法返回都是false,那么这个新节点将被添加到末尾,如果返回都是true,那么这个节点的value将会被覆盖。
(b) v = map.get(k)实现原理:
先调用k的hashCode()方法得出哈希值,通过哈希算法转化成数组下标,通过数组下标快速定位到某个位置上,如果这个位置上什么也没有,返回null,如果这个位置上有单向链表,那么会拿着这个参数k和单向链表上的每一个节点中的k进行equals,如果返回的是false,那么get方法返回null,如果其中一个节点的k和参数k进行equals返回true,那么这个节点的value就是我们要找的value,get方法最终返回这个value
为什么哈希表增删效率以及查阅效率都很高?
因为增删在链表上完成,查询不需要都扫描,只需要部分扫描

6.通过上述可以得出HashMap集合中的key先调用两个方法,一个是HashCode(),一个是equals(),这两个方法都需要重写

7.HashMap集合的key部分特点:
无序不可重复。无序是因为不一定挂到哪个链表上,不可重复是因为,equals方法来保证HashMap集合中的key不可重复,如果重复了value会覆盖,放在HashMap集合key部分元素就是放到HasSet中所以HashSet集合中元素也需要重写HashCode()+equals()方法中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值