清除和重新加载java哈希表时,内存是如何管理的

清除和重新加载java哈希表时,内存是如何管理的,java,Java,如果我有一个java哈希表或HashMap,并加载一组带有一组键的条目,如果我“清除()”它,然后使用相同键的子集与其他条目一起重新加载它,它会重用相同的表内存而不抖动吗?而不必“重新整理”或重新分配和重建它的表 原因是我有一个非常动态的记录池,并希望使用一组常用的键控元素的不同子集高效地重新加载它们-如果它不必在清除后进行任何重新计算和重新灰化(如果我使用的是最初构建表时使用的同一组键),那么这将非常好。我想这里可能有人知道,而不是我花很多时间来检查源代码并测试它:) 谢谢 在清除之前,无论地

如果我有一个java哈希表或HashMap,并加载一组带有一组键的条目,如果我“清除()”它,然后使用相同键的子集与其他条目一起重新加载它,它会重用相同的表内存而不抖动吗?而不必“重新整理”或重新分配和重建它的表

原因是我有一个非常动态的记录池,并希望使用一组常用的键控元素的不同子集高效地重新加载它们-如果它不必在清除后进行任何重新计算和重新灰化(如果我使用的是最初构建表时使用的同一组键),那么这将非常好。我想这里可能有人知道,而不是我花很多时间来检查源代码并测试它:)


谢谢

在清除之前,无论地图上是否存在相同的对象,都会重新计算每个条目的哈希值

实际上,
HashMap#put
的代码以以下内容开头:

public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);   // hash the key everytime, no concept of cache

clear
方法的主要优点是不将
HashMap
设置为其初始容量,避免任何无用的大小调整。()

你对这些细节过于关注了。我可以向你保证,无论你在做什么选择过程,你都会在10倍于你的对象中旋转。我发现,在处理大型数据集的高速操作时,这些事情很重要。证明当然是在测试中。如果可行的话,哈希表可以更好地用于查找固定大小数组中的索引。这取决于每条记录相对于可能的键总数的稀疏程度。那么,为什么你不简单地检查一下代码来找出答案呢?可能有人已经花了几个小时来测试它:)我假设它调用o.hashCode(),然后计算整数。我想知道它是重用相同的表项还是分配新的表项。我猜在这一点上,它保留了基表(数组),但是条目本身和包含每个哈希代码可能有多个条目的链表都会被丢弃并重新分配。