ArrayList
和HashMap
都有构造函数来设置初始容量,但ArrayList
提供ensure容量()
以确保如果预期插入大量元素,内部数组已经增加。在某些情况下,HashMap
也可能发生同样的事情。那么为什么HashMap
没有确保容量的方法来保持存储桶准备就绪?
HashMap
与ArrayList
根本不同。
数组列表中的“bucket”数正好是后备数组的大小,当它满了,它就满了。
HashMap中“bucket”的数量并不能很好地指示它可以存储多少个对象,因为多个对象可以散列到同一个bucket,Java采用的冲突解决策略是链接(即,如果有多个对象散列,则为bucket创建一个链表或类似的链表)。(需要引用!)
确保HashMap中的bucket数并不能确保在达到无法忍受的性能降低的负载系数之前将它们全部填满。因此,负载因子是一种更好的方法,可以确保您具有所需的性能。
简而言之,这不是很有用。
像ArrayList和HashMap之类的结构都有容量的概念,容量是用户无法直接看到的一些内部数组的长度。容量不同于大小,大小是结构中逻辑上包含的元素或条目的数量。
“容量”这个词实际上用词不当,因为它实际上并不代表对用户有意义的任何限制。这是一个实现细节。随着元素或条目的添加,内部数组将自动透明地调整大小。更改容量没有语义学。您无法判断调用ensure容量()
是否真的更改了容量,如果它确实更改了容量,列表或映射仍然等于它之前等于的任何内容。
在API中引入容量概念的原因是为了在用户知道要添加很多元素的情况下提高性能。在用户知道要添加很多元素的情况下,这有助于避免重复调整大小的开销。最常见的情况是在构建时,您很可能知道要添加多少元素。
请注意,批量添加方法(addAll
或putAll
)将查看即将添加的内容的大小,并对目标进行任何必要的大小调整一次。
你可以调用Arraylist。如果您有一个要向其中添加大量元素的现有列表,请确保资源共享();你很清楚要添加多少;你必须一次添加一个,而不是批量添加;您的应用程序对性能非常敏感,因此必须避免多次调整大小。这似乎很少见。
可以想象一个API哈希映射。ensureCapacity()。如有必要,它将调整内部表的大小,然后将所有元素重新灰化到此表的存储桶中。如果将来添加了大量条目,这将有助于避免重复调整大小/重新合并。从语义上讲,这是一件合理的事情,但它真正有用的情况似乎很少。
底线是HashMap。ensureCapacity()可以添加,但它的用处很小,因此从来没有优先添加它。
通过在 Java 中使用 VarHandle 类,您可以实现对对象的原子操作,通过这些操作,像 AtomicReferenceArray 这样的类可以对数组的元素执行并发操作,而无需锁定(同步)整个数组结构,从而显著提高性能。 集合的其他同步和线程安全版本没有实现此类模型是否有任何特定原因? 例如,Collections 类中的所有同步工厂方法都返回其相应集合的版本,该版本使用锁定整个集合的同步方
为什么我需要再次使用hmap.put方法? 我的理解是这样的。 假设没有现有的键值对。所以,用 如果我在同一个实例中添加一个字符串,那么hashmap也应该自动更新,对吗?键=>列表对象。如果我添加到列表对象,那么对象引用不应该改变,对吗? 为什么我需要再次使用put方法并这样做?
在上面的代码中,我得到的输出是: 在我做 d1.name 之后=“亚瑟” 我期望输出是
问题内容: 为什么列表没有像字典一样安全的“获取”方法? 问题答案: 最终,它可能没有一个安全的方法,因为a是一个关联集合(值与名称相关联),在这种情况下,检查键是否存在(并返回其值)而不抛出异常是非常低效的,而这是非常琐碎的避免异常访问列表元素(因为该方法非常快)。该方法允许您查询与名称关联的值,而不是直接访问字典中的第37个项目(这更像是您要查询的列表中的内容)。 当然,您可以自己轻松实现此目
我正在创建一个进行线性探测以查找键索引的哈希图。如果键已经在索引中,我想增加它的值,而不是向新索引添加一个。 例如,如果我得到字符串“五,五,五”的字数,我的输出是五1,五1,五1,而不是五3。 我认为一定是我的 containsKey 方法,它使用 get 方法来检查我的密钥是否已在映射中。下面是我的Hashmap.java类。
我正在使用wedriveri o 4.5: 我需要等到某个元素存在,如果它不存在,处理这种情况。 例如: 但如果页面上不存在元素,webdriver会将我的测试标记为失败,并显示消息:“超时10000毫秒。”。尝试减少运行时间或增加测试规格的超时时间(http://webdriver.io/guide/testrunner/timeouts.html); 如果回复promise,确保其得到解决 >