Java 访问此对象的最快方式

Java 访问此对象的最快方式,java,data-structures,collections,Java,Data Structures,Collections,假设我有一个1000000个用户的列表,其中他们的唯一标识符是他们的用户名字符串。因此,要比较两个用户对象,我只需覆盖compareTo()方法,比较用户名成员 给定用户名字符串,我希望从列表中找到User对象。在一般情况下,最快的方法是什么 我猜是一个HashMap,将用户名映射到User对象,但我想知道是否还有其他我不知道的东西,哪一个更好。如果你不需要将它们存储在数据库中(这是通常的情况),HashMap可以很好地工作-它的查找复杂性为O(1) 如前所述,通常的情况是将它们放在数据库中。但

假设我有一个1000000个用户的列表,其中他们的唯一标识符是他们的用户名字符串。因此,要比较两个用户对象,我只需覆盖
compareTo()
方法,比较用户名成员

给定用户名字符串,我希望从列表中找到
User
对象。在一般情况下,最快的方法是什么


我猜是一个
HashMap
,将用户名映射到
User
对象,但我想知道是否还有其他我不知道的东西,哪一个更好。

如果你不需要将它们存储在数据库中(这是通常的情况),
HashMap
可以很好地工作-它的查找复杂性为O(1)

如前所述,通常的情况是将它们放在数据库中。但是为了获得更快的结果,缓存被利用了。您可以使用EhCache-它类似于
ConcurrentHashMap
,但对于元素和跨多台机器分发的选项,它有生存的时间


您不应该将整个数据库转储到内存中,因为它将很难同步。您将面临使地图中的条目无效并使其保持最新的问题。缓存框架使这一切变得更容易。还要注意的是,数据库有自己的优化,用户不太可能被保存在内存中以便更快地访问。

如果您不需要将用户存储在数据库中(这是通常的情况),则
HashMap
可以正常工作-它的查找复杂性为O(1)

如前所述,通常的情况是将它们放在数据库中。但是为了获得更快的结果,缓存被利用了。您可以使用EhCache-它类似于
ConcurrentHashMap
,但对于元素和跨多台机器分发的选项,它有生存的时间


您不应该将整个数据库转储到内存中,因为它将很难同步。您将面临使地图中的条目无效并使其保持最新的问题。缓存框架使这一切变得更容易。还要注意的是,数据库有自己的优化,您的用户不太可能被保存在内存中以便更快地访问。

我肯定您需要一个哈希映射。它们是最快的,而且内存效率高。正如在其他回复中所指出的,字符串是一个很好的键,因此您不需要重写任何内容。(以下情况也是如此。)

主要的替代方法是树状图。这会更慢,并且a会占用更多的内存。不过,它要灵活得多。同一张地图有5个条目和500万条条目,效果非常好。你不需要事先提供线索。如果您的列表大小差异很大,树映射将根据需要获取内存,如果不需要,则将其释放。Hashmaps不太擅长放手,正如我在下面解释的,它们在获取更多内存时可能会很尴尬

TreeMap在垃圾收集器方面的效果更好。他们要求以容易找到的小块形式存储。如果您启动一个有100000个条目空间的哈希表,当它满了时,它将释放100000个元素(在64位机器上几乎是一个megabye)数组,并请求一个更大的元素。如果它重复这样做,它可以超越GC,GC倾向于抛出内存不足异常,而不是花费大量时间收集和集中零散的可用内存位。(它更愿意以牺牲您的机器拥有大量内存的声誉为代价来保持其速度的声誉。您确实可以在堆的90%未使用的情况下设法耗尽内存,因为它是碎片化的。)

因此,如果你正在全速运行你的程序,你的名字列表的大小变化很大——也许你甚至有几个名字列表的大小变化很大——树状图对你来说会更好


毫无疑问,哈希映射正是您所需要的。但是当事情变得非常疯狂时,就会出现ConcurrentSkipListMap。这就是树形图的所有特性,只是有点慢。另一方面,它允许随意添加、更新、删除和读取多个线程,而无需同步。(我提到它只是为了完整。)

我肯定你想要一个哈希映射。它们是最快的,而且内存效率高。正如在其他回复中所指出的,字符串是一个很好的键,因此您不需要重写任何内容。(以下情况也是如此。)

主要的替代方法是树状图。这会更慢,并且a会占用更多的内存。不过,它要灵活得多。同一张地图有5个条目和500万条条目,效果非常好。你不需要事先提供线索。如果您的列表大小差异很大,树映射将根据需要获取内存,如果不需要,则将其释放。Hashmaps不太擅长放手,正如我在下面解释的,它们在获取更多内存时可能会很尴尬

TreeMap在垃圾收集器方面的效果更好。他们要求以容易找到的小块形式存储。如果您启动一个有100000个条目空间的哈希表,当它满了时,它将释放100000个元素(在64位机器上几乎是一个megabye)数组,并请求一个更大的元素。如果它重复这样做,它可以超越GC,GC倾向于抛出内存不足异常,而不是花费大量时间收集和集中零散的可用内存位。(它更愿意以牺牲您的机器拥有大量内存的声誉为代价来保持其速度的声誉。您确实可以在堆的90%未使用的情况下设法耗尽内存,因为它是碎片化的。)

因此,如果你正在全速运行你的程序,你的名字列表的大小变化很大——也许你甚至有几个名字列表的大小变化很大——树状图对你来说会更好

毫无疑问,哈希映射正是您所需要的。但是当事情变得非常疯狂时,就会出现ConcurrentSkipListMap