热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在指定精确容量时,为什么HashMap会再次调整大小()?

如何解决《在指定精确容量时,为什么HashMap会再次调整大小()?》经验,为你挑选了2个好方法。

代码说的不仅仅是文字,因此:

final int size = 100;
Map m = new HashMap<>(size);
for (int i = 0; i 

为什么HashMap内部调用时间!resize() 21 2(感谢Andreas在内部确认JVM使用HashMaps,21个cals中的19个来自其他进程)

resize()我的申请仍然无法接受两次通话.我需要对此进行优化.

如果我是一个新的java开发人员,我首先直观地猜测HashMap构造函数中的"容量"意味着它是我(HashMap的使用者)将要放入Map中的元素数量的容量.但是这是错误的.

如果我想优化我对HashMap的使用,以便它根本不需要自己调整大小,那么我需要非常了解HashMap的内部结构,以确切知道HashMap存储桶阵列需要多么稀疏.这在我看来很奇怪.HashMap应隐式为您执行此操作.这是OOP中封装的全部要点.

注意:我已经确认resize()是我的应用程序用例的瓶颈,所以这就是为什么我的目标是减少调用resize()的次数.

问题:

如果我知道我要预先在地图中输入的确切数量.我选择了什么容量,以防止任何额外的呼叫resize()操作?有点像size * 10?我还想了解为什么这样HashMap设计的背景.

编辑:我被问到很多为什么这个优化是必要的.我的应用程序在hashmap.resize()中花费了大量的CPU时间.我的应用程序使用的哈希映射被初始化,其容量等于我们放入其中的元素数量.因此,如果我们可以减少resize()调用(通过选择更好的初始容量),那么我的应用程序性能会得到改善.



1> Andreas..:

默认的加载因子是0.75,即3/4,这意味着当添加了100个值中的75个时,将调整内部哈希表的大小.

仅供参考: resize()只被叫两次.一旦添加第一个值,一旦它达到75%满.

要防止调整大小,您需要确保第100个值不会导致调整大小,即size <= capacity * 0.75aka size <= capacity * 3/4aka size * 4/3 <= capacity,所以要确保:

capacity = size * 4/3 + 1

size = 100,这意味着capacity = 134.


@Bobulous正确.这是一种节省内存的优化,因为测试表明通常在没有添加值的情况下创建集合对象,因此现在使用最小内存占用创建集合,并且在添加第一个值之前不会应用初始容量.
@JamesWierzba如果你向一个容量为100的地图中添加了100个元素,那么`resize()`只被调用两次.如果你创建一个只有问题代码的小测试程序,请注意JVM启动创建*other*`HashMap`对象,所以不要对所有其他对象计算`resize()`调用.只计算`m`实例上的调用.---在Java 10上测试过.你在运行什么版本?
@Andreas - 你是对的!我确认通过JVM正在进行的任何引导,HashMap被调用了19次,并且我的代码被调用了2次:)

2> xtratic..:

如有疑问,请阅读文档.对于文档HashMap解释的折衷initial capacityload-factor相当不错.

根据文档,如果initCapacity = (maxEntries / loadFactor) + 1在添加条目时不会发生重新操作操作.凡在此情况下,maxEntries100因为你指定和loadFactor会默认加载因子.75.

但除了设置初始大小以避免重新散列(resize())之外,您应该仔细阅读文档HashMap以便正确调整它,同时考虑初始容量和负载因子.

如果您关心查找成本而不是空间,那么如果您愿意,可以尝试使用较低的loadFactors .5或更低的s .在这种情况下,您将使用以下两个参数创建哈希映射:

final float loadFactor = 0.5;
final int maxEntries   = 100;
final int initCapacity = (int) maxEntries / loadFactor + 1;
new HashMap<>(initCapacity, loadFactor);

(强调我的)

HashMap的一个实例有两个影响其性能的参数:初始容量和负载因子.容量是哈希表中的桶数,初始容量只是创建哈希表时的容量.加载因子是在自动增加容量之前允许哈希表获取的完整程度的度量.当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新哈希(即,重建内部数据结构),以便哈希表具有大约两倍的桶数.
......
作为一般规则,默认负载系数(.75)在时间和空间成本之间提供了良好的折衷.较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大多数操作中,包括get和put).在设置其初始容量时,应考虑映射中的预期条目数及其加载因子,以便最小化重新散列操作的数量.如果初始容量大于最大条目数除以加载因子,则不会发生重新加载操作.


@Andreas另一方面,Java本身使用浮点数进行计算.
推荐阅读
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 我有3个来自RESEARCHS的映射值,指定要使用参考数据集填充的行中的范围。该研究 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • 类Hashtable<K,V>所有已实现的接口:Serializable,Cloneable,Map<K,V>此类实现一个哈希表,该哈希表将键映 ... [详细]
author-avatar
xianghuanghaibo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有