在添加几个小数后向 HashSet 添加一个大数:会发生什么?

Add a large number to HashSet after adding several small numbers: what will happen?

我正在学习 HashSet-s,但我不太明白他们是如何构建 tables 的。我阅读的每篇文章都在谈论 % hash set 函数,这似乎暗示我应该将几个小数字(整数)添加到 HasSet(例如 1、7、14)然后添加一个大数字(例如 2732780)-table 因为 HashSet 将立即增长到一个巨大的大小,其中包含大量的空单元格。我对么?如果不是,那么 numbers/elements 以什么形式存储?我在哪里可以详细阅读此内容?

更新:澄清一下: 假设我的散列函数是 x = (input / 10), y = (input % 10),这意味着在我上面的示例中,当您添加 1、7 和 14 时,HashSet 会像这样构建 table:

问题是,如果我加上2732780会怎样? table 应该会爆炸吧?还有很多空号?

在 Java 中,HashSet 是使用 HashMap 实现的(从算法的角度来看,在 C# 中没有理由会有所不同)。

这篇文章解释了 HashMap 如何很好地工作: https://www.geeksforgeeks.org/internal-working-of-hashmap-java/

关键是有一个地图容量的概念。这是一个包含地图桶的数组。选择哪个索引的计算是:

index = hashCode(key) & (n-1)

n 是容量。这意味着当您向集合/映射中插入更多条目时,实现将增长并且 re-hash 它的条目。

哈希集使用一个哈希函数。这会将任何数据类型转换为 int。然后将此 int 放入桶中。这是通过使用 % 和可用桶的数量来完成的。

说是x % 10。然后它看起来像这样:

|input   |hashcode    |bucket
|1       |     1      |1
|7       |     7      |7
|14      |     14     |4
|2732780 |    2732780 |0

如果有两个条目具有相同的桶,则会保留一个列表,并且在该桶内查找是线性的。该实施将根据需要增加存储桶。

https://docs.microsoft.com/en-us/dotnet/api/system.object.gethashcode?view=netcore-3.1#System_Object_GetHashCode