【问题标题】:In Java, which is the most recommended class for a dictionary data structure?在 Java 中,最推荐的字典数据结构类是哪个?
【发布时间】:2011-01-01 07:06:57
【问题描述】:

我需要一个数据结构来存储应该通过 id 检索的用户。 我注意到有几个类实现了 Map 接口。哪一个应该是我的默认选择?他们似乎都和我相当。

【问题讨论】:

    标签: java dictionary map


    【解决方案1】:

    这可能取决于您计划拥有多少用户,以及您是否需要订购他们或仅通过 id 获取单个项目。

    HashMap 使用哈希码来存储内容,因此您有固定的时间进行putget 操作,但项目始终是无序的。

    TreeMap 改为使用二叉树,因此您有 log(n) 时间进行基本操作,但项目在树中保持有序。

    我会使用HashMap,因为它更简单(记得给它一个合适的初始容量)。请记住,这些数据结构默认情况下是不同步的,如果您打算从多个线程中使用它,请注意使用ConcurrentHashMap

    一种中间方法是LinkedHashMap,它使用与HashMap 相同的结构(哈希码和equals 方法),但它也保留了插入到映射中的元素的双向链表(保持插入顺序)。这种混合已经订购了物品(按照插入顺序的顺序排列,正如 cmets 所建议的那样......只是为了准确,但我已经指定了)而没有TreeMap 的性能损失。

    【讨论】:

    • LinkedHashMap 在遍历所有键时会比 TreeMap 更好,但对于单次查找会更差; TreeMap 让您在更大的数据集中更快更快地进行单次查找。
    • "此混合已订购商品" 这取决于您认为订购的商品。 TreeMap 保持所有元素按外部标准排序。 LinkedHashMap 使它们按插入顺序排列。
    • 实际上 TreeMap 是 log(n) 用于 put/get 而 LinkedHashMap 是恒定时间,所以我认为你是对的。 LinkedHashMap 是一个 HashMap,它也有一个列表。仅此而已,仅此而已。主要区别在于 TreeMap 保持项目按值排序,而 LinkedHashMap 保持项目按插入顺序排序..
    【解决方案2】:

    无并发:使用java.util.HashMap

    并发:使用java.util.concurrent.ConcurrentHashMap

    如果您想对迭代器使用的顺序进行一些控制,请使用TreeMapLinkedHashMap

    【讨论】:

    • 你没有提到 LinkedHashMap 和 TreeMap。
    • 在他的情况下它们看起来没什么用,是吗?
    • @Jerome:这取决于他是否会在某个时候迭代所有用户。 TreeMap 是唯一能以正确顺序返回它们的地图。
    • @Jerome:不,因为它是用户定义的。
    【解决方案3】:

    Java Collections Trail Implementations 页面对此进行了介绍。

    【讨论】:

      【解决方案4】:

      如果它们看起来都相同,那么您还没有阅读文档。 Sun 的文档非常简洁,为您的选择提供了非常重要的要点。

      开始here

      【讨论】:

      • 否,但相关文档的链接以及对每种情况的使用的简要说明都可以。
      • 现在阅读。我敢肯定它们并不是真正的“等价物”。我只是说 non 似乎比另一个更适合我的目的。我对 java(和编程)有点陌生
      • 我添加了一个指向 Map 文档的链接,其中包含指向实现的链接。 Sun已经给出了最简短的解释。没有更多细节,这是任何人都可以做的最好的事情。 “简要说明”将省略可能重要的点。
      • @john,在所有其他条件相同的情况下,您将使用与您的目标一致的最轻量级结构。
      【解决方案5】:

      您的选择可能会根据您打算如何使用数据结构以及您希望在哪里获得性能 - 读取或写入进行修改?

      在用户登录系统中,我的猜测是您的读取次数将多于写入次数。

      【讨论】:

        【解决方案6】:

        (我知道我已经回答过一次,但我觉得这需要说)

        您是否考虑过使用数据库来存储这些信息?即使是SQLite,也可能比将用户数据库存储在程序代码中或每次将整个数据集加载到内存中要容易。

        【讨论】:

        • 我没有考虑使用数据库,因为我是一名刚接触编程的大学生,目前对数据库一无所知。不过谢谢。
        猜你喜欢
        • 1970-01-01
        • 2013-08-20
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 2010-11-14
        相关资源
        最近更新 更多