Java 中的重新哈希2025年3月17日 | 阅读 10 分钟 在数据结构中,哈希是最重要的概念,用于将给定的键转换为另一个值。可以使用哈希函数生成新值。 在本节中,我们将结合负载因子和哈希概念来理解Java 中的 Rehash。 ![]() RehashRehash 是一种动态扩展 Map、Array 和 Hashtable 大小的技术,以保持 O(1) 的 get 和 put 操作复杂度。 它也可以定义为rehash 是在 map 中的元素数量达到最大阈值时,重新计算已存储条目的哈希码并将其移动到更大尺寸的哈希 map 的过程。 简单来说,rehash 是哈希过程的逆过程。它保留了性能。在 rehash 中,负载因子起着至关重要的作用。 负载因子负载因子 是一个决定何时增加 HashMap 或 Hashtable 容量的度量,以保持 O(1) 复杂度的get() 和 put() 操作。 HashMap 的负载因子的默认值为 0.75(map 大小的 75%)。简而言之,我们可以说负载因子决定了“何时增加桶的数量来存储键值对”。 较大的负载因子:空间消耗较低,但查找次数较多。较小的负载因子:与所需元素数量相比,空间消耗较大。 如何计算负载因子? 可以使用以下公式计算负载因子 例如 HashMap 的初始容量 = 16 这表示 HashMap 的第 12 个键值对将保持其大小为 16。一旦第 13 个元素(键值对)进入 HashMap,它将把大小从默认的 24 = 16 个桶增加到 25 = 32 个桶。 负载因子示例让我们通过一个例子来理解负载因子。 我们知道 HashMap 的默认桶大小为 16。我们插入第一个元素,然后检查是否需要增加 HashMap 容量。这可以通过以下公式确定 HashMap 的大小 (m) / 桶的数量 (n) 在这种情况下,HashMap 的大小是 1,桶的大小是 16。所以,1/16 = 0.0625。现在将获得的值与默认负载因子 (0.75) 进行比较。 0.0625 < 0.75 该值小于默认负载因子的值。因此,无需增加 HashMap 的大小。因此,在第 12 个元素之前,我们不需要增加 HashMap 的大小,因为 12/16 = 0.75 获得的值等于默认负载因子,即 0.75。 一旦我们在 HashMap 中插入第 13 个元素,HashMap 的大小就会增加,因为 13/16 = 0.8125 这里,获得的值大于默认负载因子值。 0.8125 > 0.75 为了将第 13 个元素插入 HashMap,我们需要增加 HashMap 的大小。 如果您想将 get() 和 put() 操作的复杂度保持为 O(1),建议将负载因子设置在 0.75 左右。 为什么需要 Rehash?当负载因子增加时,需要 Rehash。当我们向 map 中插入键值对时,负载因子会增加,这也会增加时间复杂度。通常,HashMap 的时间复杂度为 O(1)。为了降低 HashMap 的时间复杂度和负载因子,我们实现了 rehash 技术。 在以下条件下,我们应该使用 rehash
实现 Rehash要实现 rehash 过程,必须遵循以下步骤
由于 N 个元素的 rehash 成本将是 Rehash Java 程序让我们在 Java 程序中实现 rehash 技术。 RehashingExample.java 输出 HashMap created Number of pairs in the Map: 0 Size of Map: 5 Default Load Factor : 0.75 Pair(1, Hyundai) inserted successfully. Current Load factor = 0.2 Number of pairs in the Map: 1 Size of Map: 5 Current HashMap: key = 1, val = Hyundai Pair(2, KIA) inserted successfully. Current Load factor = 0.4 Number of pairs in the Map: 2 Size of Map: 5 Current HashMap: key = 1, val = Hyundai key = 2, val = KIA Pair(3, Toyota) inserted successfully. Current Load factor = 0.6 Number of pairs in the Map: 3 Size of Map: 5 Current HashMap: key = 1, val = Hyundai key = 2, val = KIA key = 3, val = Toyota Pair(4, Mahindra) inserted successfully. Current Load factor = 0.8 0.8 is greater than 0.75 Therefore Rehashing will be done. ***Rehashing Started*** Pair(1, Hyundai) inserted successfully. Current Load factor = 0.1 Number of pairs in the Map: 1 Size of Map: 10 Pair(2, KIA) inserted successfully. Current Load factor = 0.2 Number of pairs in the Map: 2 Size of Map: 10 Pair(3, Toyota) inserted successfully. Current Load factor = 0.3 Number of pairs in the Map: 3 Size of Map: 10 Pair(4, Mahindra) inserted successfully. Current Load factor = 0.4 Number of pairs in the Map: 4 Size of Map: 10 ***Rehashing Done*** New Size of Map: 10 Number of pairs in the Map: 4 Size of Map: 10 Current HashMap: key = 1, val = Hyundai key = 2, val = KIA key = 3, val = Toyota key = 4, val = Mahindra Pair(5, Jeep) inserted successfully. Current Load factor = 0.5 Number of pairs in the Map: 5 Size of Map: 10 Current HashMap: key = 1, val = Hyundai key = 2, val = KIA key = 3, val = Toyota key = 4, val = Mahindra key = 5, val = Jeep Pair(6, Ford) inserted successfully. Current Load factor = 0.6 Number of pairs in the Map: 6 Size of Map: 10 Current HashMap: key = 1, val = Hyundai key = 2, val = KIA key = 3, val = Toyota key = 4, val = Mahindra key = 5, val = Jeep key = 6, val = Ford Pair(7, BMW) inserted successfully. Current Load factor = 0.7 Number of pairs in the Map: 7 Size of Map: 10 Current HashMap: key = 1, val = Hyundai key = 2, val = KIA key = 3, val = Toyota key = 4, val = Mahindra key = 5, val = Jeep key = 6, val = Ford key = 7, val = BMW Pair(8, Audi) inserted successfully. Current Load factor = 0.8 0.8 is greater than 0.75 Therefore Rehashing will be done. ***Rehashing Started*** Pair(1, Hyundai) inserted successfully. Current Load factor = 0.05 Number of pairs in the Map: 1 Size of Map: 20 Pair(2, KIA) inserted successfully. Current Load factor = 0.1 Number of pairs in the Map: 2 Size of Map: 20 Pair(3, Toyota) inserted successfully. Current Load factor = 0.15 Number of pairs in the Map: 3 Size of Map: 20 Pair(4, Mahindra) inserted successfully. Current Load factor = 0.2 Number of pairs in the Map: 4 Size of Map: 20 Pair(5, Jeep) inserted successfully. Current Load factor = 0.25 Number of pairs in the Map: 5 Size of Map: 20 Pair(6, Ford) inserted successfully. Current Load factor = 0.3 Number of pairs in the Map: 6 Size of Map: 20 Pair(7, BMW) inserted successfully. Current Load factor = 0.35 Number of pairs in the Map: 7 Size of Map: 20 Pair(8, Audi) inserted successfully. Current Load factor = 0.4 Number of pairs in the Map: 8 Size of Map: 20 ***Rehashing Done*** New Size of Map: 20 Number of pairs in the Map: 8 Size of Map: 20 Current HashMap: key = 1, val = Hyundai key = 2, val = KIA key = 3, val = Toyota key = 4, val = Mahindra key = 5, val = Jeep key = 6, val = Ford key = 7, val = BMW key = 8, val = Audi Pair(9, Mercedes-Benz) inserted successfully. Current Load factor = 0.45 Number of pairs in the Map: 9 Size of Map: 20 Current HashMap: key = 1, val = Hyundai key = 2, val = KIA key = 3, val = Toyota key = 4, val = Mahindra key = 5, val = Jeep key = 6, val = Ford key = 7, val = BMW key = 8, val = Audi key = 9, val = Mercedes-Benz Pair(10, Ferrari) inserted successfully. Current Load factor = 0.5 Number of pairs in the Map: 10 Size of Map: 20 Current HashMap: key = 1, val = Hyundai key = 2, val = KIA key = 3, val = Toyota key = 4, val = Mahindra key = 5, val = Jeep key = 6, val = Ford key = 7, val = BMW key = 8, val = Audi key = 9, val = Mercedes-Benz key = 10, val = Ferrari 下一主题Java 中的轮转调度程序 |
任务是确定给定序列中缺失的数字。数组将包含此范围内的所有数字,除了一个。查找缺失数字的方法朴素方法:使用哈希此方法涉及创建一个辅助数组(hashArray)来跟踪频率...
5 分钟阅读
软件开发需要日志记录,这对于调试和故障排除也至关重要。Java 中的 Logger 类是日志记录数据的关键工具,并在许多应用程序中得到广泛使用。Java 标准库包含 Logger 类,它提供了一种简单灵活的机制...
阅读 4 分钟
? 在本节中,我们将学习为什么我们在 Java 中使用构造函数,构造函数的目的和必要性是什么。除此之外,我们还将看到构造函数的类型。在 Java 中,构造函数类似于方法。构造函数的属性...
阅读 3 分钟
继承是面向对象编程中最强大的特性。它允许我们将一个类的属性继承到另一个类中。继承 继承是一种将新类从现有类派生的机制。现有(旧)类称为基类或...
阅读 6 分钟
在 Java 中,提供的字符通过 Reader 类的 read(char[]) 函数读取到数组中。尝试读取数组长度数量的字符后,将返回成功读取的字符数。在处理...时,通常会采用此技术。
阅读 4 分钟
在浩瀚的编程语言海洋中,Java 是一种多功能且强大的工具,它使开发人员能够承担复杂的软件开发项目。水手(或程序员)必备的 stdin 和 stdout、媒体 Java 程序以及与外部世界的通信。stdin 的起源:使用 stdin,Java...
阅读 4 分钟
排列可以定义为,将给定集合的所有成员排列成序列的过程。排列系数用 P(n, r) 表示。它给出从 n 个元素中取 r 个元素的排列数。因此,如果我们有...
阅读 8 分钟
桶排序是一种排序技术,其中元素首先被均匀地分成几个称为桶的组。之后,使用任何排序算法对元素进行排序,最后,按排序顺序收集元素。在本节中,我们将学习桶排序...
5 分钟阅读
在面向对象编程 (OOP) 的领域中,Java 一直是一个重要的参与者,为开发人员提供了创建健壮且灵活的软件系统的强大工具。随着 Java 8 的发布,编程格局在开发人员设计和构建代码的方式上发生了重大变化……
阅读 4 分钟
在 Java 中,银行家算法是一种死锁避免和资源分配算法。该算法通过模拟预先确定的所有资源的可能最大数量的分配来测试安全性。然后,在决定是否允许分配继续之前,它会创建一个...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India