我有一个程序处理大量数据集.由于程序一直在寻找容器中的对象,因此最好将对象存储在散列实现的容器中.
第一个想法是使用HashMap,因为获取和删除此容器的方法更适合我需要的用途.
但是,我开始看到HashMap的使用是相当大的内存消耗品,这是一个主要问题,所以我认为切换到HashSet会更好,因为它只使用<E>,而不是<K,V>每个元素,但当我看到我学到的实现它使用底层的HashMap!这意味着它不会节省任何记忆!
所以这是我的问题:
>我所有的假设都是真的吗?
> HashMap内存是否浪费?更具体地说,每个条目的开销是多少?
> HashSet和HashMap一样浪费吗?
>是否有任何其他基于哈希的容器将显着减少内存耗材?
更新
根据评论中的要求,我将对我的程序进行一些扩展,hashMap意味着保存一对其他对象,以及一些数值 – 一个浮点数 – 从它们计算出来.一路上它提取了一些并进入新的对.给定一对它需要确保它不会保持这对或移除它.可以使用float对象的float值或hashCode来完成映射.
另外,当我说“巨大的数据集”时,我说的是~4 * 10 ^ 9个对象
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