gpt4 book ai didi

Java : HashSet vs. 哈希表

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:03:05 24 4
gpt4 key购买 nike

我有一个处理大量数据集的程序。对象最好存储在哈希实现的容器中,因为程序会不断在容器中寻找对象。

第一个想法是使用HashMap,因为这个容器的get和remove方法更适合我需要的用途。

但是,我发现 HashMap 的使用非常消耗内存,这是一个主要问题,所以我认为切换到 HashSet 会更好,因为它只使用 <E> ,而不是 <K,V>每个元素,但是当我查看实现时,我了解到它使用底层 HashMap!这意味着它不会节省任何内存!

所以这是我的问题:

  • 我所有的假设都是正确的吗?
  • HashMap 内存浪费吗?更具体地说,每个条目的开销是多少?
  • HashSet 和 HashMap 一样浪费吗?
  • 是否有任何其他基于 Hash 的容器会显着减少内存消耗?

    更新

根据评论中的要求,我将对我的程序进行一些扩展,hashMap 用于保存一对其他对象,以及一些数值 - 一个从它们计算的 float 。在此过程中,它会提取其中的一些并输入新的对。给定一对它需要确保它不持有这对或删除它。可以使用浮点值或 hashCode 来完成映射。对对象的。

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

最佳答案

this site 上有非常有用的提示关于 Java 中的集合性能。

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.

THashSet 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 中截取的图片可以帮助我们在选择合适的 Collection 时牢记一些东西

enter image description here

关于Java : HashSet vs. 哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28261457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com