【问题标题】:Is there a java hash structure with keys only and no values?是否有一个只有键而没有值的 java 哈希结构?
【发布时间】:2010-10-02 09:14:17
【问题描述】:

我正在寻找一种无需值即可散列键的结构。查询时,如果找到密钥,则返回 true,否则返回 false。我正在寻找类似的东西 Hashtable<MyClass, Boolean> 除了插入只需要一个键并且查询只返回真或假,永远不会为空。

【问题讨论】:

    标签: java list hash collections


    【解决方案1】:

    你需要 Java 的 HashSet (Java 8)。

    来自the official documentation的描述是:

    这个类实现了 Set 接口,由一个哈希表支持 (实际上是一个 HashMap 实例)。它不保证 集合的迭代顺序;特别是,它不保证 随着时间的推移,订单将保持不变。此类允许 null 元素。

    此类为基本操作提供恒定时间性能 (添加、删除、包含和大小),假设散列函数分散 桶中的元素正确。迭代这个集合 所需时间与 HashSet 实例大小的总和成正比 (元素的数量)加上支持 HashMap 的“容量” 实例(桶的数量)。因此,不要设置是非常重要的 初始容量太高(或负载系数太低)如果 迭代性能很重要。

    请注意,此实现不同步。如果多个线程 同时访问一个哈希集,以及至少一个线程 修改集合,它必须在外部同步。这是 通常通过同步一些自然而然的对象来完成 封装集合。如果不存在这样的对象,则该集合应该是 使用 Collections.synchronizedSet 方法“包装”。这是最好的 在创建时完成,以防止意外的不同步访问 集合:

    Set s = Collections.synchronizedSet(new HashSet(...));

    这个类的迭代器方法返回的迭代器是快速失败的: 如果集合在迭代器创建后的任何时间被修改,在 任何方式,除了通过迭代器自己的删除方法,迭代器 引发 ConcurrentModificationException。于是,面对 并发修改,迭代器快速而干净地失败, 而不是冒着随意的、非确定性的行为的风险 未来未定时间。

    请注意,无法保证迭代器的快速失败行为 因为一般来说,不可能做出任何硬性保证 在存在不同步的并发修改的情况下。快速失败 迭代器尽最大努力抛出 ConcurrentModificationException 基础。因此,编写一个依赖的程序是错误的 关于这个例外的正确性:快速失败的行为 迭代器应该只用于检测错误。

    此类是 Java 集合框架的成员。

    【讨论】:

      【解决方案2】:

      Java Set 旨在删除重复项,希望 HashMap 必须在内部使用 Java Set 来管理键,因为键永远不会有重复项,因此您应该考虑根据您的要求设置。

      【讨论】:

      • 相反,HashSet内部使用HashMap,HashMap使用某种链表的数组(由Entry.HashMap创建)
      【解决方案3】:

      另见静态方法Collections#newSetFromMap,它根据给定的地图实现创建一个集合。例如,这对于创建弱哈希集非常方便。

      【讨论】:

        【解决方案4】:

        java.util.HashSet?使用 contains() 进行查找。

        【讨论】:

        • 可能很明显,因为它是一个“哈希”,但是 contains() 方法的预期时间复杂度是 O(1)。
        猜你喜欢
        • 2022-08-02
        • 2019-03-19
        • 2021-11-23
        • 2013-04-04
        • 2016-02-27
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        相关资源
        最近更新 更多