gpt4 book ai didi

java - 从哈希表中读取值显示了自然顺序的倒数

转载 作者:行者123 更新时间:2023-12-02 02:14:32 24 4
gpt4 key购买 nike

为什么在执行以下代码时,HashMap 和 Hashtable 在读取值时具有不同的行为,因为它们都基于相同的哈希码方法(整数哈希码)来存储值,并且这两种结构之间的唯一区别是:线程安全性和允许空键和值:

public static void main(String[] args) {
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(4,"4");
hashtable.put(2,"2");
hashtable.put(3,"3");
hashtable.put(8,"8");
System.out.println(hashtable.values());// [8, 4, 3, 2]

HashMap<Integer, String> hashMap = new HashMap<>();
hashMap.put(4,"4");
hashMap.put(2,"2");
hashMap.put(3,"3");
hashMap.put(8,"8");
System.out.println(hashMap.values());// [2, 3, 4, 8]
}

最佳答案

注意:这不是记录的行为,并且在其他 JVM 版本/更新或 JVM 实现中可能有所不同。话虽如此,它不太可能有所不同,因为可能有依赖此行为的程序,并且不太可能有充分的理由更改默认实现。

<小时/>

在 Oracle/OpenJDK 中 HashMap 以自然顺序出现的原因是,对于较小的 hashCode() 值,键恰好不是在底层数组中随机排列的。对于小于容量且不会被简单的位重新排列函数“搅动”的非负值,hashCode 的值也是数组中的索引。

HashMap 的迭代器从数组的开头到结尾。

对于 Hashtable,布局是相同的,区别在于 values() 从数组末尾迭代到开头。

    public boolean hasMoreElements() {
Entry<?,?> e = entry;
int i = index;
Entry<?,?>[] t = table;
/* Use locals for faster loop iteration */
while (e == null && i > 0) {
e = t[--i];
}
entry = e;
index = i;
return e != null;
}

我怀疑这是一种微优化,迭代器不需要与大小进行比较,而是与 0

简而言之,它不是线程安全的,允许 null 也不允许初始容量。 (容量仅与适用的值范围有关)

关于java - 从哈希表中读取值显示了自然顺序的倒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49479576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com