1.HashMap的阈值是容量*加载因子,加载因子为0.75,默认hashMap容量为16,也就是说map里的值超过12个就要调用resize方法
2.通过阅读源码,resize方法要新建一个Entry[]数组,容量为之前的二倍,然后通过transfer方法对之前数据进行rehash,然后将原来的数据放入新数组。取hash方法为 h & (length-1),这个方法是h % length方法的优化,资料上说效率会快5-8倍
3.阅读时主要是对transfer
void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry<K,V> e = src[j];
if (e != null) {
src[j] = null;
do {
Entry<K,V> next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];// 有疑问行
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
开始以为可以使用 e.next = null;代替,后来通过跟踪调试才明白,还是自己脑子太笨啊
后来通过调试jdk源码才理解。相同hashcode的值会以链表形式放在数组同一下标位置,第一次取newTable[i]时,它为null,如果数组同一下标的链表还有值的话,需要把当前元素的next指向之前元素,以此类推这样transfer就完成了
4.jdk源码跟踪调试,用原始的jdk.zip是不能查看变量的,需要下载http://www.java.net/download/jdk6/6u10/promoted/b08/binaries/jdk-6u10-ea-bin-b08-windows-i586-debug-30_nov_2007.jar ,运行命令 java -jar jar文件名称,然后将项目jdk换成新安装的jdk就可以跟踪调试了
分享到:
相关推荐
HashMap之resize()方法源码解读 HashMap的resize()方法是HashMap中最核心的方法之一,该方法负责扩容HashMap的容量,以便存储更多的键值对。下面我们将对HashMap的resize()方法进行源码解读,了解其扩容机制和原理...
Java源码解析HashMap的resize函数 HashMap的resize函数是Java中HashMap实现的关键部分之一,该函数用于对HashMap初始化或者扩容。下面将详细解析该函数的实现机理和源码。 resize函数的作用 resize函数的主要作用...
同时,`addEntry()`会检查当前HashMap的大小是否超过了阈值(size >= threshold),如果是,则执行`resize()`方法进行扩容。 `resize()`方法会创建一个新的、两倍大的数组,并使用`transfer()`方法将旧数组的所有...
10. **resize()**:当HashMap达到其装载因子限制时,resize()方法会被调用,将现有数组的大小翻倍,然后将所有元素重新哈希到新数组中。这个过程虽然消耗资源,但是能保持HashMap的高效性能。 11. **HashMap的实现...
2. resize()方法的问题:HashMap在容量达到阈值时会进行扩容操作,这个过程中需要重新计算键的哈希值并调整元素的位置。在多线程环境下,两个线程同时触发扩容可能导致循环链表的形成,从而引发死循环,这是一种严重...
HashMap通过resize()方法来完成这一操作: ```java void addEntry(int hash, K key, V value, int bucketIndex) { // 省略细节... if (size++ >= threshold) { resize(2 * table.length); } } ``` HashMap的扩...
Java HashMap的死循环原因分析 HashMap是Java中一种常用的数据结构...HashMap的死循环问题是由resize操作引发的,而resize操作是HashMap的内部机制。为了避免死循环问题,我们应该使用ConcurrentHashMap代替HashMap。
同时,我们还可以看到HashMap的 resize 操作,用于扩展HashMap的容量以适应不断增加的数据。 结论 在本文中,我们详细介绍了如何模拟Java的HashMap集合,使用数组和链表来实现Hash表的存储。我们从基本概念开始,...
3. **死循环(死锁)**:在极端情况下,由于HashMap的迭代器依赖于table的状态,如果在迭代过程中table结构发生变化(比如resize),可能会造成迭代器陷入死循环。 为了解决这些问题,有以下几种策略: 1. **使用...
HashMap 之 put 方法源码解读 HashMap 是 Java 中一种常用的数据结构,用于存储键值对。其中,put 方法是 HashMap 中最重要的方法之一,负责将键值对存储到HashMap 中。在本文中,我们将对 HashMap 的 put 方法的...
HashMap的`put()`、`get()`和`resize()`方法是核心,理解它们的实现可以避免在实际使用中出现性能瓶颈。 HashSet是一个不包含重复元素的集合,它基于HashMap实现。HashSet的元素添加和查找效率高,因为它依赖于...
加载因子是哈希表当前key的数量和容量的比值,当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表提前进行resize操作。 HashMap的get方法源码分析: get方法是HashMap中最常用的方法之一,其...
HashMap的一个数据结构 锁升级:锁升级过程 resize的过程在开发中 怎么保证容器它线程安全后就是数据插入过程使用的头插法 但是头插法会造成一些问题等等等等的那个等等的那个等等的那个等等的那个等等的那个等等的...
if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null)………………………………后续代码省略………………………………这里就是根据数组...
当size超过阈值时,HashMap会进行resize操作,扩大容量。 5. `loadFactor`:负载因子,定义了在HashMap达到多大容量时进行扩容的阈值比例。 在实际使用HashMap时,需要注意其非线程安全的特性,避免在多线程环境中...
这个迁移过程在`resize()`方法中实现。在多线程环境下,如果两个线程几乎同时触发扩容,问题就可能产生。 例如,假设初始数组长度为2,已有两个元素分别在索引0处形成链表。线程A和线程B同时尝试添加新元素,这会...
在JDK7中,resize()方法的效率直接影响到HashMap的性能。 通过对JDK7中HashMap源码的深入剖析,我们可以了解到HashMap的高效性和内部机制,这对于优化代码和理解数据结构有极大的帮助。同时,也需要注意在不同版本...