Java:HashSet 与 HashMap

2024-01-25

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

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

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

这是我的问题:

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

    update

按照评论中的要求,我将在我的程序上进行一些扩展,hashMap 旨在保存一对其他对象,以及一些数值(从它们计算得出的浮点数)。在此过程中,它会提取其中一些并输入新的对。给定一对,它需要确保它不持有该对或将其删除。可以使用浮点值或hashCode对对象的。

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


有非常有用的提示这个网站 http://java-performance.info/关于java中集合的性能。

HashSet是建立在一个HashMap< T, Object >,其中值为 单例“当前”对象。代表着the memory consumption of aHashSet is identical to HashMap: 为了存储SIZE价值观,你需要32 * 尺寸 + 4 * 容量字节(加上值的大小)。这绝对不是一个记忆友好的集合。

THashSet http://trove4j.sourceforge.net/javadocs/gnu/trove/set/hash/THashSet.html可能是最简单的替代系列HashSet– 它实现了 Set 和 Iterable,这意味着您应该在集合的初始化中只更新一个字母。

THashSet使用单个对象数组作为其值,因此它使用4 * 容量用于存储的字节。正如你所看到的,与 JDK HashSet 相比,你会save 32 * 尺寸在相同负载因子的情况下字节数,这是一个巨大的改进。

还有我拍摄的下面的图片here http://www.sergiy.ca/guide-to-selecting-appropriate-map-collection-in-java/可以帮助我们在选择正确的收藏时记住一些事情

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:HashSet 与 HashMap 的相关文章

随机推荐

  • ContentControl + RenderTargetBitmap + 空图像

    我试图创建一些图表图像 而不在屏幕上显示这些图表 我已经做了很长一段时间并尝试了很多不同的事情 但似乎没有任何效果 如果我首先在窗口中显示图表 则代码可以完美运行 但是如果我不在窗口中显示它 则位图只是带有黑色边框的白色 不知道为什么 我尝
  • 访问原始 Apache Web 服务器请求

    我打算设计一个网络 GPS 跟踪应用程序 GPS 使用 TCP 无 HTTP 标头 在端口 7070 我打算将其更改为 80 上传输数据 我知道 GPS 跟踪器和客户端之间的通信协议 但是我被困住了 因为我无法拦截网络服务器上的数据包 由于
  • 无法运行项目 - Android Studio 2.0 Crashlytics 问题

    我将 Android Studio 更新到 2 0 并尝试让即时运行正常工作 Gradle 同步有效 重建项目正在进行中 尝试运行 失败 我究竟做错了什么 变量 io fabric tools gradle 1 14 4 com andro
  • :hover 在拖放时粘在元素上

    我有简单的 ol li 结构 想添加拖放功能 此外 我想以不同的颜色突出显示悬停项目和拖动项目 但这是 WebKit 中的一个不寻常的错误 捕获最后一个项目 将其拖到顶部 将其拖放到第一项 最后一个元素捕获悬停伪类 为什么 我该如何预防 这
  • 代码语法荧光笔[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找自动语法荧光笔 当我指定代码的起点和终点时 语法突出显示应自动识别代码类型 例如 sql v
  • Android SSLEngine 示例

    我需要为我正在开发的应用程序使用基于 TLS 的 TCP 套接字 我已经经历了几十个例子 虽然我没有问题地完成握手 但我似乎无法通过任何方式读取输入流 尝试了很多 包括 readline 读取字符数组等 每次我尝试时 应用程序都会在该位置冻
  • Netbeans 中的 hibernate 逆向工程找不到 SQL Server 表

    我的机器上安装了测试 SQL Server 数据库 创建了一个测试 SQL Server 帐户 并使用该帐户在 TestDb 中的默认架构上创建了两个表 在我的 Java Web 应用程序 简单的 JSP 上 我使用 Hibernate 并
  • 何时需要将应用程序源包含在测试目标中?

    在一个新项目中我有这个简单的测试 import
  • 将选择的更改提交到另一个分支,然后恢复当前分支的工作?

    这种情况经常发生在我的工作流程中 我正在一个单独的分支中开发一个功能 在执行此操作时 我会遇到需要修复但来自框架或站点布局较高层的小问题 我想切换回主界面develop从那里选择文件分支并提交更改 然后返回到feature分支 然后变基 以
  • 宽字符输出结果[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 为什么使用 wchar t 时得到数
  • 从 Java 调用 Python

    我想打电话给python来自 Java 的脚本 我的python版本是2 5 Java版本是6 我当前的代码 try Process p Runtime getRuntime exec path dirs file py p waitFor
  • 尝试使用 C# 代码将数据输入到访问文件时出现无效的 Sql 语句错误[重复]

    这个问题在这里已经有答案了 我的错误是 System Data OleDb OleDbException 无效的 SQL 语句 应为 DELETE INSERT PROCEDURE SELECT 或 UPDATE 这是我的代码 我检查以确保
  • 在 Eclipse 中隐藏状态栏或进度栏

    如何隐藏 Eclipse 中的状态栏 我指的是底部的那个 其中还显示 进度 状态 它非常分散注意力 因为它一直在做某事 我看了一下这个问题 https stackoverflow com questions 5645495 how to h
  • 使用 Mockito 的 ArgumentCaptor 类来匹配子类

    下面的代码显示了我的问题 实际上 我尝试使用 Mockito 的 ArgumentCaptor 来验证某个具体类是否调用过一次方法 如果可能的话 我想在这里使用 ArgumentCaptor 但我开始怀疑我需要使用自定义 ArgumentM
  • 本机窗口queueBuffer函数不渲染来自Stagefright解码器的输出

    我将 SurfaceView 表面从 Java 传递到 JNI 在 JNI 中我从该表面获取本机窗口 Stagefright从 mp4 文件中解码 h264 帧 在解码过程中我调用ANativeWindow queueBuffer 为了发送
  • Rails 4:如何使用includes() 和where() 来检索关联对象

    我不知道如何使用 where 方法来检索关联的模型数据 在此示例中 项目属于用户 class Project lt ActiveRecord Base belongs to user has many videos end class Us
  • 为什么 GCC 的 -Wconversion 对于 char 和 unsigned char 的行为不同?

    Consider U8 foo U8 x U8 y return x y 如果 x 和 y 的类型 U8 是 char 或 unsigned char GCC 的 Wconversion 的行为会有所不同 gcc Wconversion c
  • 循环绘制子图

    z A 0 3618426 0 36146951 B 1 8908799 1 904695 C 2 1813462e 08 2 1833622e 08 D 0 89925492 0 89953589 E 2 6356747 2 631791
  • 如何使用 Excel VBA 单击网页上的链接?

    我正在编写 VBA 代码来从用户那里获取股票代码 导航到网站 输入股票代码并单击相应的链接 我研究了这个StackOverflow 问题和回复 https stackoverflow com questions 21002756 how t
  • Java:HashSet 与 HashMap

    我有一个程序正在处理巨大的数据集 对象最好存储在散列实现的容器中 因为程序不断在容器中寻找对象 第一个想法是使用HashMap 因为这个容器的get和remove方法更适合我需要的用途 但是 我发现 HashMap 的使用非常消耗内存 这是