Load Factor in HashMap10 Sept 2024 | 4 分钟阅读 HashMap 是 Java 集合框架中高性能的数据结构之一。它提供了插入和检索的恒定时间性能。有两个因素会影响 HashMap 的性能。
在创建 HashMap 对象时,我们需要非常谨慎地选择这两个因素。加载因子和初始容量可以在创建 HashMap 类构造函数时进行配置,如下所示: HashMap 的初始容量HashMap 的初始容量是哈希表中 **桶** 的数量。它是在我们创建 HashMap 类对象时创建的。HashMap 的初始容量为 **24**,即 **16**。当容量达到阈值时,HashMap 的容量会 **翻倍**。容量会增加到 **25=32,26=64**,依此类推。 假设我们实现了 hashCode() 方法,该方法确保键值对在 16 个桶中均匀分布。 考虑以下场景:
从以上场景我们可以观察到,HashMap 中的项目数量是 **翻倍** 的。每个桶的最大查找时间没有显著增加,几乎保持 **恒定**。 或者,hashmap 以 **2n** 的幂次增长,并在达到其极限的起点继续增长。 负载因子加载因子是一个度量,它决定何时 **增加** HashMap 的容量,以维持 get() 和 put() 操作的 **O(1)** 复杂度。HashMap 的默认加载因子为 **0.75f**(占映射大小的 75%)。 问题 问题在于,保持桶大小固定(即 16),我们不断增加映射中的总项数,这会扰乱时间复杂度。 解决方案 当我们增加桶的总数时,每个桶中的总项数开始增加。现在,我们可以为每个桶保持恒定的项数,并为 get() 和 put() 操作保持 O(1) 的时间复杂度。 加载因子是如何计算的加载因子决定“何时增加桶的数量”。 我们可以使用以下公式找到何时增加哈希映射的大小: 哈希映射的初始容量为 = 16 这表示哈希映射的第 12 个键值对将保持其大小为 16。一旦第 13 个元素(键值对)进入 Hashmap,它将从默认的 **24 = 16** 个桶增加到 **25 = 32** 个桶。 另一种计算大小的方法 当加载因子比率 (m/n) 达到 0.75 时,hashmap 会增加其容量。 其中, m 是哈希映射中的条目数。 n 是哈希映射的总大小。 加载因子的示例让我们通过一个例子来理解加载因子。 我们知道哈希映射的默认桶大小是 16。我们插入第一个元素,然后检查是否需要增加哈希映射的容量。这可以通过以下公式确定: 在这种情况下,哈希映射的大小为 **1**,桶大小为 **16**。因此,**1/16 = 0.0625**。现在将此值与默认加载因子进行比较。 0.0625<0.75 因此,无需增加哈希映射的大小。 在第 12 个元素之前,我们不需要增加哈希映射的大小,因为: 12/16=0.75 此加载因子等于默认加载因子,即 0.75。 一旦我们在哈希映射中插入第 13 个元素,哈希映射的大小就会增加,因为: 13/16=0.8125 这大于默认的哈希映射大小。 0.8125>0.75 现在我们需要增加哈希映射的大小。 如果要将 get 和 put 的复杂度保持在 O(1),建议将加载因子设置为 0.75 左右。 下一个主题Java 教程 |
Java 中的自动提升是一种特性,当较小的数据类型用于表达式或方法调用时,它会自动将它们转换为较大的数据类型。它用于确保表达式中的操作数或方法中的参数具有...
阅读 4 分钟
Java 9 私有接口方法 在 Java 9 中,我们可以在接口中创建私有方法。接口允许我们声明私有方法,这些方法有助于在非抽象方法之间共享公共代码。在 Java 9 之前,在接口中创建私有方法会导致编译时错误。以下...
阅读1分钟
?序列化是 Java 中的一种强大机制,它允许将对象转换为字节流,然后可以存储或传输该字节流,之后再将其重构回原始对象。它为持久化对象状态或在不同应用程序之间传输对象提供了一种简单的方法……
阅读 4 分钟
在本节中,我们将通过适当的示例讨论什么是 zigzag 数组(锯齿形数组)。我们还将创建一个 Java 程序来将普通数组转换为 zigzag 数组,反之亦然。什么是 zigzag 数组?一个数组称为……
阅读 6 分钟
在本节中,我们将学习 Java 中的 Morris 遍历(用于中序遍历)。在 Morris 遍历中,我们无需递归或堆栈即可遍历树。Morris 遍历基于线索化二叉树。在此遍历中,我们……
阅读 4 分钟
Java 是面向对象编程领域中最受欢迎且经常使用的语言之一。在过去的几年里,Java 凭借其强大而灵活的功能,一直是软件开发的主流。在 Java 中,继承和接口是两个基本概念...
阅读 4 分钟
在开发软件应用程序时,尤其是命令行程序时,通常使用菜单驱动的方法,为用户提供与应用程序交互的清晰有组织的途径。Java 作为一种用途广泛且广泛使用的编程语言,为实现菜单驱动程序提供了完美的平台。在...
7 分钟阅读
问题陈述 复制整数堆栈的示例最好描述如下:通常,我们需要一个辅助堆栈或其他数据结构来建立这种情况。当然,在这种情况下,我们没有额外的空间进行克隆,所以我们需要...
5 分钟阅读
以下是演示此程序的程序。文件:ConvertStringToInteger.java public class ConvertStringToInteger { public static void main(String[] args) { // 第一种方式 String str1 = "5"; int result = Integer.parseInt(str1); // 使用 Integer.parsrInt() System.out.println(result); // 第二种方式 String str2 = "5"; Integer result2 =...
阅读1分钟
Java 是一种广泛使用的面向对象编程语言,它提供了各种特性来帮助构建健壮且灵活的应用程序。对象模型中两个重要的 Java 概念是静态成员和非静态成员。理解静态成员和非静态成员之间的区别对于有效的 Java...来说至关重要。
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India