【发布时间】:2011-01-01 07:06:57
【问题描述】:
我需要一个数据结构来存储应该通过 id 检索的用户。 我注意到有几个类实现了 Map 接口。哪一个应该是我的默认选择?他们似乎都和我相当。
【问题讨论】:
标签: java dictionary map
我需要一个数据结构来存储应该通过 id 检索的用户。 我注意到有几个类实现了 Map 接口。哪一个应该是我的默认选择?他们似乎都和我相当。
【问题讨论】:
标签: java dictionary map
这可能取决于您计划拥有多少用户,以及您是否需要订购他们或仅通过 id 获取单个项目。
HashMap 使用哈希码来存储内容,因此您有固定的时间进行put 和get 操作,但项目始终是无序的。
TreeMap 改为使用二叉树,因此您有 log(n) 时间进行基本操作,但项目在树中保持有序。
我会使用HashMap,因为它更简单(记得给它一个合适的初始容量)。请记住,这些数据结构默认情况下是不同步的,如果您打算从多个线程中使用它,请注意使用ConcurrentHashMap。
一种中间方法是LinkedHashMap,它使用与HashMap 相同的结构(哈希码和equals 方法),但它也保留了插入到映射中的元素的双向链表(保持插入顺序)。这种混合已经订购了物品(按照插入顺序的顺序排列,正如 cmets 所建议的那样......只是为了准确,但我已经指定了)而没有TreeMap 的性能损失。
【讨论】:
无并发:使用java.util.HashMap
并发:使用java.util.concurrent.ConcurrentHashMap
如果您想对迭代器使用的顺序进行一些控制,请使用TreeMap 或LinkedHashMap。
【讨论】:
Java Collections Trail Implementations 页面对此进行了介绍。
【讨论】:
如果它们看起来都相同,那么您还没有阅读文档。 Sun 的文档非常简洁,为您的选择提供了非常重要的要点。
开始here。
【讨论】:
您的选择可能会根据您打算如何使用数据结构以及您希望在哪里获得性能 - 读取或写入进行修改?
在用户登录系统中,我的猜测是您的读取次数将多于写入次数。
【讨论】:
(我知道我已经回答过一次,但我觉得这需要说)
您是否考虑过使用数据库来存储这些信息?即使是SQLite,也可能比将用户数据库存储在程序代码中或每次将整个数据集加载到内存中要容易。
【讨论】: