马上过年了,很感谢各位小老弟的关注哦。
2018年的jdk集合框架专栏还有一些没写完,这几天刚好赶一下,不能再拖了。前面的重写过ArrayList和LinkedList,有木有很有意思呀~ 如果觉得很有意思就对了,接下来我们来拜访下HashMap大爷。
咱们先来分析一下HashMap的数据结构,这里我画了一张图:
这个图其实很简单,但是实际实现起来就很麻烦了。
HashMap就是数组和链表的结合体,先是根据hash值找到Entry[ ]数组的索引,hash值相等的键值对将会存到同一个数组索引的位置上。然后再根据key值找链表的位置,对应的存到链表的表尾。
很简单有没有,HashMap就这样巧妙的利用了数组方便寻址的优点,也利用了链表方便删除和插入的优点。
我们可以这样理解,数组的作用是先确定一个大概的范围,这样就不用像数组一样,操作一个数,一定要遍历完。然后链表是在数组确定了位置的基础上细分,这样就在一定程度上大大提高了效率! 当然jdk8中,当链表长度大于8,链表会自动变成红黑树。
明人不说暗话,我们先来实现一下put()方法,上代码!!!
package Study.Collection;
/**
* <p>Description: 自定义一个HashMap
* 实现了put方法增加键值对,并解决了键重复的时候覆盖相应的节点</p>
* @author zhangyan
* @date 2019/1/28 20:07
*/
public class YanHashMap {
/**
* 位桶数组。bucket array
*/
Node2[] table;
/**
* 存放的键值对的个数
*/
int size;
/**
* 定义构造函数
*/
public YanHashMap() {
//长度一般定义成2的整数幂
table = new Node2[16];
}
/**
* put方法
* @param key
* @param value
*/
public void put