Java 当哈希表生成巨大的哈希代码时会发生什么?

Java 当哈希表生成巨大的哈希代码时会发生什么?,java,arrays,hashmap,hashtable,Java,Arrays,Hashmap,Hashtable,我对hashmaps/hashtables有点困惑,因为无论我在哪里,我都没有得到我想要的答案。我仍然不知道哈希映射是使用静态数组还是使用动态查找。这就是我最初认为hashmaps是如何存储的: [Bucket 0] Object 1 [Bucket 4] Object 2 [Bucket 8000] Object 3 我认为,如果你想从bucket 8000中获取值,你必须搜索它之前的每个bucket键,直到达到8000为止。现在,在阅读和观看了一些视频后,我认为它存储为一个基本数组,如:

我对hashmaps/hashtables有点困惑,因为无论我在哪里,我都没有得到我想要的答案。我仍然不知道哈希映射是使用静态数组还是使用动态查找。这就是我最初认为hashmaps是如何存储的:

[Bucket 0] Object 1
[Bucket 4] Object 2
[Bucket 8000] Object 3
我认为,如果你想从bucket 8000中获取值,你必须搜索它之前的每个bucket键,直到达到8000为止。现在,在阅读和观看了一些视频后,我认为它存储为一个基本数组,如:

[Bucket 0] Object 1
[...3 buckets in between]
[Bucket 4] Object 2
[...7795 buckets in between]
[Bucket 8000] Object 2

但是,当某些东西生成巨大的哈希代码时,它将浪费大量内存。然后某个地方了解到,可能它使用
%
操作符来防止它们使用太大的索引,但是每个bucket更可能发生冲突。那是哪一个呢?我认为最明智的是第一个想法,但我不确定。谢谢。

将哈希代码取为数组长度的模,以生成一个界内索引(
HashMap
尤其是首先对给定的哈希代码应用一个二级哈希函数,以防止写得不好的哈希函数)。如果哈希表开始填充超过某个阈值,则数组将展开,所有元素都将重新插入。冲突是可能的,但如果使用好的哈希函数,冲突应该很少发生。

我不知道您是基于什么假设的。查看HashMap源代码比猜测要好。看起来散列值和索引之间存在映射,这意味着您不会浪费大量内存。约书亚·布洛赫比这聪明多了。我不喜欢这个答案,但我想这是有道理的。谢谢@用户3803380没问题。你不喜欢什么?我猜它仍然使用内存来存储未使用的元素,但这可能没什么大不了的。@user3803380通常不是。这是恒定时间查询/更新的折衷方案。