为什么 Sun Java 中的 HashSet 实现使用 HashMap 作为其支持?

2024-02-18

查看Java 6的源码,HashSet<E>实际上是使用实现的HashMap<E,Object>,在集合的每个条目上使用虚拟对象实例。

我认为这浪费了条目本身大小的 4 个字节(在 32 位机器上)。

但是,为什么它仍然被使用呢?除了更容易维护代码之外,还有什么理由使用它?


其实,这不仅仅是HashSet. All的实施SetJava 6 中的接口基于底层Map。这不是一个要求;这就是实现的方式。您可以通过查看各种实现的文档来亲自了解Set http://java.sun.com/javase/6/docs/api/java/util/Set.html.

您的主要问题是

但是,为什么它仍然被使用呢?有没有 除了制造它之外还有任何理由使用它 更容易维护代码?

我认为代码维护是一个很大的激励因素。防止重复和膨胀也是如此。

Set and Map是相似的接口,因为不允许重复的元素。 (我认为唯一Set not由一个支持Map is CopyOnWriteArraySet,这是一个不寻常的 Collection,因为它是不可变的。)

具体来说:

来自的文档Set http://java.sun.com/javase/6/docs/api/java/util/Set.html:

一个集合不包含 重复的元素。更正式地说, 集合不包含元素对 e1 和 e2 使得 e1.equals(e2),并且在 最多一个空元素。正如所暗示的 正如它的名字一样,这个接口模型 数学集合抽象。

Set 接口放置了额外的 规定,超出继承的规定 从集合界面上 所有建造商的合同以及 add、equals 和 的合约 哈希码方法。声明 其他继承的方法也是 为方便起见,将其包含在此处。 (这 随附的规格 声明已根据 设置接口,但不包含 任何附加规定。)

附加规定 毫不奇怪,构造函数 所有构造函数都必须创建一个 不包含重复项的集合 元素(如上定义)。

并从Map http://java.sun.com/javase/6/docs/api/java/util/Map.html:

将键映射到值的对象。 映射不能包含重复的键;每个键最多可以映射到一个值。

如果你能实现你的Set如果使用现有代码,您可以从现有代码中实现的任何好处(例如速度)都会增加到您的Set以及。

如果您选择实施Set没有Map支持,您必须复制旨在防止重复元素的代码。啊,真是美妙的讽刺。

也就是说,没有什么可以阻止您实施您的Set不同的是。

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

为什么 Sun Java 中的 HashSet 实现使用 HashMap 作为其支持? 的相关文章

  • 抽象超类的默认接口方法

    可以说我有以下结构 abstract class A abstract boolean foo interface B default boolean foo return doBlah class C extends A implemen
  • 如何获取枚举的子集

    大多数情况下 包含所有元素的枚举显示在用户界面的下拉列表中 我们只需要在用户界面中显示 5 个字段中的 2 个 通过某种方式利用可用于枚举的相同函数来获取此数据的更简单方法是什么 enum Color RED GREEN BLACK BLU
  • 哪个类调用了我的静态方法?

    假设我有一个带有静态方法的 Java 类 如下所示 class A static void foo Which class invoked me 进一步假设 A 类有任意数量的子类 class B extends A class C ext
  • 使用 Spring MVC 返回 PDF 文件

    实际上 我有这个功能 我有一个框架 可以在其中设置 URL ip port birt preview report report rptdesign format pdf parameters 并且该框架呈现 PDF 文件 但我想隐藏该网址
  • java替代Thread.stop()来中断特定调用

    我正在寻找一种方法来告诉这个调用 大约需要 20 120 秒 final Area image final AffineTransform transform new AffineTransform transform scale imag
  • 使用 xuggle 将 mp3 转换为 wav 出现异常

    我正在尝试将 mp3 转换为 wav 代码在这里 String mp3 F work pic2talk38512 mp3 String wav F work pic2talk38512 wav TranscodeAudioAndVideo
  • 警告:跳过条目,因为它不是绝对 URI。 NetBeans 中的 GlassFish

    我成功安装了 GlassFish 但是 当我启动服务器时 我收到两条警告消息 警告 跳过条目 因为它不是绝对 URI 那是关于什么的 Launching GlassFish on Felix platform Aug 09 2014 10
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • DateTimeFormatter.parseLocalDate 抛出 UnsupportedOperationException

    该API用于解析本地日期 http joda time sourceforge net apidocs org joda time format DateTimeFormatter html parseLocalDate 28java la
  • MongoDB:尝试从 JSON 读取 Long 导致 java.lang.Integer 无法转换为 java.lang.Long

    我有一个代码可以从 MongoDB 读取特定格式的数据 我需要测试一下 为此 我使用要测试的数据创建一个 JSON id ObjectId 57552e32e4b0839ede67e0af serial 574000690 startDat
  • 在java.util中获取错误ArrayList不带参数[重复]

    这个问题在这里已经有答案了 我已经创建了一个类 Student 现在我尝试将我的 Student 对象存储在 ArrayList 中 但在编译 ArrayList 不接受参数时出现错误 我已经检查了我的代码很多次 但找不到问题所在 我的学生
  • Ant 无法启动,给出主类错误

    我正在运行 Elementary OS 基于 Ubuntu 12 并且在运行 apache ant 时遇到问题 它在重新启动之前就可以正常工作 所以我不确定会发生什么变化 我在 etc environment 中定义了环境变量 如下所示 P
  • 在Java中使用BufferedWriter写入文件时监视文件大小?

    我正在将一个可能很长的项目列表写入文件 我正在写的项目的长度是可变的 如果生成的文件大小大于10M 则应将其分成多个文件 为了提高性能 我目前使用 BufferedWriter 如下所示 final FileOutputStream fos
  • Akka 和 spring 配置

    我正在尝试将 akka 与 spring 结合起来 但没有成功 基本上 我的应用程序似乎不习惯读取 akka 模式 具有架构的 service context xml 的一部分
  • 多对多不检索映射数据

    Spring boot 2 5 6 我无法安装版本 概要文件 java Getter Setter NoArgsConstructor AllArgsConstructor EqualsAndHashCode FieldDefaults l
  • 我可以关闭并重新打开套接字吗?

    我学习了一个使用套接字的例子 在此示例中 客户端向服务器发送请求以打开套接字 然后服务器 侦听特定端口 打开套接字 一切都很好 套接字从双方 客户端和服务器 打开 但我仍然不清楚这个东西有多灵活 例如 客户端是否可以关闭一个打开的 从两端
  • Java .split("|") 不工作

    我刚刚遇到了一个问题分割法 http docs oracle com javase 6 docs api java lang String html split 28java lang String 29for 字符串不适用于字符 作为一个
  • Apache Kafka 是否提供异步订阅回调 API?

    我的项目正在将 Apache Kafka 视为老化的基于 JMS 的消息传递方法的潜在替代品 为了让这个过渡尽可能的顺利 如果替代的排队系统 Kafka 有一个异步订阅机制那就更理想了 类似于我们当前项目使用的JMS机制MessageLis
  • Microsoft JDBC 中的 JTDS 属性相当于什么?

    我正在将 JTDS 连接更改为 Microsoft JDBC 并且我看到存在于http jtds sourceforge net faq html http jtds sourceforge net faq htmlMicrosoft JD
  • JSP 和 scriptlet

    我知道现在使用 scriptlet 被认为是禁忌 没关系 我会同意Top Star的话 因为我目前只是Java新手 到目前为止我听到的是 它是为了让设计师的生活更轻松 但我想知道 这是否与JSP页面的性能有关 另一方面 如果只是为了 让设计

随机推荐

  • Python中的时间范围重叠算法

    我有一个包含不同 ID 开始日期和结束日期的列表 让我们说 5 d datetime 2010 9 19 0 0 0 d datetime 2010 9 19 0 5 10 6 d datetime 2010 9 19 0 0 0 d da
  • 如何在远程存储库上运行 Git 命令

    我正在尝试编写一个简单的 PHP 应用程序 它将使用终端命令从远程 Git 存储库检索一些信息 我不想创建本地工作副本或存储库 我只想从远程存储库读取信息 浏览树 提交历史记录 文件差异 下载文件 因此它将是只读连接 我需要做的是运行一系列
  • 标准加密文件格式有哪些?

    我对加密文件格式有点困惑 假设我想使用 AES 256 加密文件 我通过加密算法运行该文件 现在有了一个加密字节流 显然 我可以将该字节流写入文件 但任何第三方加密应用程序都不会理解它 因为它不期望只是原始的加密字节流 我可以将其写入什么文
  • 控制台应用程序中的命令行当前工作目录[重复]

    这个问题在这里已经有答案了 可能的重复 如何找出我的控制台应用程序在 C 中运行的目录 https stackoverflow com questions 97312 how do i find out what directory my
  • 如何对齐和居中输入字段?

    我有一个 HTML 表单 输入字段已经居中 但它们没有垂直对齐 我想让所有标签和输入垂直对齐 以便所有标签都在同一垂直线上 并且所有输入都在同一垂直线上 到目前为止 我所拥有的只是 div 内的字段 div class container
  • 更好的 Django 管理 ManyToMany 字段小部件

    我找到了 Django Admin 的默认设置models ManyToManyField小部件使用起来很麻烦 这是HTML 选择 http www htmlcodetutorial com forms SELECT MULTIPLE ht
  • mysql.server 启动时出现 PID 错误?

    我刚刚尝试使用自制程序 在 Mac OS X 10 6 上 安装 MySQL 但我在第一个障碍时遇到了问题 当尝试手动启动服务器 mysql server start 时 出现以下错误 ERROR Manager of pid file q
  • 在 CSS 中将内部 div 与右下对齐

    将我的内部 div 放在右下角的最简单方法是什么 div style width 200px height 200px border 3px FF6666 solid div style font weight bold text alig
  • 使用 RxJS 从多个 API 调用构建数据

    我试图更好地了解如何使用 RxJS 运算符来解决我遇到的特定问题 我实际上有两个问题 但它们很相似 我正在从 API 端点获取一堆文档 api v3 folders folderId documents我已经设置了具有执行此操作的功能的服务
  • 按下按钮时 GPIO 事件检测不给出输出

    以下 python 脚本应该等待按钮按下 打印按钮按下消息 然后退出 但是 当我按下按钮时 什么也没有打印 然后 当我按回车键时 脚本会打印 检测到按钮按下 然后停止 我如何修复此代码 以便在按下按钮时打印 检测到按钮按下 我按照教程制作了
  • 使用Guava Cache将数据持久化到硬盘

    我是番石榴缓存的新手 如何在缓存中创建以下内容 像平常一样将数据保存在内存中 当缓存的大小超过给定的数字时 它将把缓存中的数据持久保存在硬盘上的可配置文件中 这可能会有所帮助 扩展 Guava 缓存以溢出到磁盘 http www javac
  • 将参数传递给 data.table 聚合函数

    我有一个函数可以计算变量的加权平均值 并使用以下方法按时间段对其进行分组data table聚合语法 但是 我想以编程方式提供加权列的名称 有没有办法在仍然使用传统方法的情况下实现这一目标data table句法 功能wtmean1下面演示
  • 应用程序在后台被杀死时的应用程序生命周期

    关于我遇到的问题的一些背景 在我的应用程序中 我有一个单例对象 我经常使用它来访问网络调用的 id 和令牌等内容 有时 当应用程序在后台被终止时 这个单例就会失去其状态 但是 当应用程序再次打开并在某些情况下启动时Activity经过发射器
  • 执行shell命令(c)

    这部分代码指示我的程序 生成屏幕截图 生成命令并退出 关闭 自身 这可用于使用程序中的键切换到程序 例如生成 gimp 或用户想要使用的另一个图像编辑器 case SWITCH TO if arg char commandline 256
  • Android 单元测试的最佳实践?

    我正在开发一个移动安卓应用程序 Android 单元测试最常用的库 框架有哪些 我感觉大部分业务逻辑 数据库测试 Web服务测试都可以使用JUnit来完成 但是 测试 UI UI 工作流程等的最佳方法是什么 例如 我们如何测试Android
  • Mechanize 无法在 Google Appengine 中自动登录 Gmail

    我已经使用 mechanize 并在 GAE 上部署了一个应用程序 它运行良好 但是 对于我正在制作的应用程序 我正在尝试通过 mechanize 自动登录 Gmail 它在本地计算机上的开发环境以及部署在 appengine 上后都不起作
  • 重新定义后更新变量值

    一个新手问题给各位 R 朋友 案例场景 我定义变量A A 数字 我根据A定义其他变量 B number A 我改变A的定义 A 不同的数字 问 如何让 R 自动更新 B 的值 而不需要再次重新定义它 例如 1 A 1000 2 B A 10
  • 如何在android中使用相机捕获自定义尺寸的图像?

    如何在android中捕捉方形图像 我想在android中通过intent调用Camera来捕获方形图像 例如300x300像素 我该怎么做 编辑 自 API 级别 21 起已弃用 使用 Camera Size 嵌套类 http devel
  • java.io.EOFException 与 paho

    我想对蚊子进行压力测试 所以我创建了一些代码 如下所示 for int i 0 i lt 800 i final int j i Thread t new Thread new Runnable Override public void r
  • 为什么 Sun Java 中的 HashSet 实现使用 HashMap 作为其支持?

    查看Java 6的源码 HashSet