HashMap,LinkedHashMap与TreeMap

HashMap:

基于Map接口实现,允许null值,非同步,不保证有序,也不保证不随时间变化。
在HashMap中有两个很重要的参数,容量(Capacity)和负载因子(Load factor)。
容量(Capacity)就是bucket的大小,负载因子(Load factor)就是bucket填满程度的最大比例。

HashMap中put函数的实现:
1.对key的hashCode做hash,然后再计算index。
2.如果没有碰撞直接放到bucket里。
3.如果碰撞了,以链表形式存放在bucket后。
4.如果碰撞导致链表过长,就把链表转换成红黑树。
5.如果节点已经存在就替换old value(保证key的唯一性)。
6.如果bucket满了,(超过(load factor*current capacity)就要resize。

HashMap中get函数的实现:
1.当调用get方法时会调用hash函数,这个hash函数会将key的hashCode值返回,返回的hashCode与Entry数组长度-1进行逻辑与运算得到一个index值,用这个index值来确定数据存储在Entry数组当中的位置。
2.通过循环来遍历索引位置对应的链表,初始值为数据存储在Entry数组当中的位置,循环条件为Entry对象不为null,改变循环条件为Entry对象的下一个节点。
3.如果hash函数得到的hash值与Entry对象当中key的hash值相等,并且Entry对象当中的key值与get方法传进来的key值equals相同则返回该Entry对象的value值,否则返回null。

RESIZE的实现:
当put时,如果目前的bucket占用程度已经超过了Load Factor所希望的比例,就会发生resize。resize过程就是把bucket扩充为2倍,之后重新计算index,把节点再放到新的bucket中。

必须知道的:
1.什么时候使用HashMap?他有什么特点?
HashMap是基于Nap接口的实现,存储键值对时,他可以接收null的值,是非同步的。HashMap存储着Entry(hash,key,value,next)对象。

2.HashMap的工作原理?
通过hash的方法,通过put和get存储和获取对象。在存储对象时,我们将key/value传给put方法,他调用hashCode计算hash从而得到bucket位置进一步存储。HashMap会根据当前bucket的占用情况自动调整容量。获取对象时,将key传给get,他调用hashCode计算hash从而得到bucket位置,并进一步调用equils()方法确定键值对。如果发生碰撞时,HashMap通过链表将产生碰撞冲突的元素组织起来。在Java 8中,如果一个bucket中碰撞冲突元素超过某个限制(默认是8个),则使用红黑树来替换链表,从而提高速度。

3.你知道get,put的·原理吗?equils()和hashCode()有什么用?
通过对key的hashCode()进行hash,并记算下标,从而获得buckets的位置,如果产生碰撞,则利用key.equils()方法去链表或树中查找对应的节点。

LinkedHashMap:

LinkedHashMap是hash表和链表的实现,并且依靠着双向链表保证了迭代顺序是插入的顺序。

三个重点实现的函数:
LinkedHashMap继承自HashMap,因此也重新实现了3个函数,其作用分别是:节点后访问,节点后插入,节点移除后做一些事情。
**afterNodeAccess函数:**在进行put之后就算是对节点的访问了,这个时候就会更新链表,把最近访问的放到最后,保证链表。
afterNodeInsertion函数:
如果用户定义了removeEldestEntry的规则,那么便可以执行相应的移除操作。
afterNodeRemoval函数:
这个函数是在移除节点后调用的,就是将节点从双向链表中删除。

TreeMap:

HashMap不保证数据有序,LinkedHashMap保证数据可以保持插入顺序,而如果我们希望Map可以保持key的大小顺序的时候,我们就需要利用TreeMap。

put函数:将指定值与此映射中的指定键相关联。如果映射以前包含键的映射,则将替换旧值。
get函数:get函数则相对来说比较简单,以log(n)的复杂度进行get。
successor后继:
怎么理解这个successor呢?只要记住,这个是中序遍历就好了,L-D-R。具体细节如下:
a. 空节点,没有后继
b. 有右子树的节点,后继就是右子树的“最左节点”
c. 无右子树的节点,后继就是该节点所在左子树的第一个祖先节点

猜你喜欢

转载自blog.csdn.net/weixin_43560292/article/details/86099207