Java:HashSet与HashMap

我有一个程序处理大量数据集.由于程序一直在寻找容器中的对象,因此最好将对象存储在散列实现的容器中.

第一个想法是使用HashMap,因为获取和删除此容器的方法更适合我需要的用途.

但是,我开始看到HashMap的使用是相当大的内存消耗品,这是一个主要问题,所以我认为切换到HashSet会更好,因为它只使用<E>,而不是<K,V>每个元素,但当我看到我学到的实现它使用底层的HashMap!这意味着它不会节省任何记忆!

所以这是我的问题:

>我所有的假设都是真的吗?

> HashMap内存是否浪费?更具体地说,每个条目的开销是多少?

> HashSet和HashMap一样浪费吗?

>是否有任何其他基于哈希的容器将显着减少内存耗材?

更新

根据评论中的要求,我将对我的程序进行一些扩展,hashMap意味着保存一对其他对象,以及一些数值 – 一个浮点数 – 从它们计算出来.一路上它提取了一些并进入新的对.给定一对它需要确保它不会保持这对或移除它.可以使用float对象的float值或hashCode来完成映射.

另外,当我说“巨大的数据集”时,我说的是~4 * 10 ^ 9个对象

有关 this site
中有关集合性能的非常有用的提示.

HashSet
is built on top of a HashMap< T, Object >
, where value is a

singleton ‘present’ object. It means that the memory consumption of aHashSet is identical to HashMap
: in order to store SIZE
values, you need 32 * SIZE + 4 * CAPACITY
bytes (plus size of your values). It is definitely not a memory-friendly collection.

07001 could be the easiest replacement collection for a HashSet
– it implements Set and Iterable, which means you should just update a single letter in the initialization of your set.

THashSet
uses a single object array for its values, so it uses 4 * CAPACITY
bytes for storage. As you can see, compared to JDK HashSet, you will save
32 * SIZE
bytes in case of the identical load factor, which is a huge improvement.

另外,我从 here
拍摄的下图可以帮助我们记住选择合适的收藏品

翻译自:https://stackoverflow.com/questions/28261457/java-hashset-vs-hashmap

原文 

https://codeday.me/bug/20190112/528283.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java:HashSet与HashMap

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址