- 博客(3)
- 收藏
- 关注
原创 HashMap源码之put方法
1.准备讲put方法之前,先看两个方法,这两个方法可以根据一个key-value键值对的key确定其在entry数组中的下标位置1.hash方法,计算key的hash值static final int hash(Object key) { int h; // h = key.hashCode() 为第一步 取hashCode值 // h ^ (h >>> 16) 为第二步 高位参与运算, return (key == null) ? 0 : (h =
2022-01-07 00:03:19
841
原创 HashMap源码之resize方法
1.扩容原理JDK7的时候先通过resize()方法对entry数组扩容,然后通过transfer()方法重新计算每个元素在新数组中的位置,对于JDK7的具体实现不再赘述。下面我们讲解下JDK1.8做了哪些优化。经过观测可以发现,我们使用的是2次幂的扩展(指长度扩为原来2倍),所以,元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置。看下图可以明白这句话的意思,n为table的长度,图(a)表示扩容前的key1和key2两种key确定索引位置的示例,图(b)表示扩容后key1和key2两种key确
2022-01-07 00:02:00
890
原创 HashMap源码之构造方法
#一、HashMap数据存储结构HashMap底层就是一个哈希表,即一个数组加链表结构,在java8中如果链表长度达到8则转化为红黑树结构,具体操作过程后面会讲到,先看看最终存储元素后HashMap的结构,Entry为HashMap内部维护的一个静态内部类,在java8改名为Node下面先来看看静态内部类Node,它其实就是一个单向链表的节点类,hash存储key对应的hash值,key和value即存储保存在HashMap中的key-value键值对,next是一个指向下一Node节点的引用stat
2022-01-06 23:42:14
785
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人