Java集合维护插入顺序

时间:2010-09-12 08:02:49

标签: java data-structures collections

为什么某些集合数据结构不能保持插入顺序?与维持插入顺序相比,实现的特殊功能是什么? 如果我们不维持订单,我们会得到一些东西吗?

10 个答案:

答案 0 :(得分:74)

性能。如果您需要原始广告订单,则会有LinkedXXX类,它们会按插入顺序维护其他链接列表。大多数时候你不在乎,所以你使用HashXXX,或者你想要一个自然的顺序,所以你使用TreeXXX。在任何一种情况下,您为什么要支付链表的额外费用?

答案 1 :(得分:17)

集合不保持插入顺序。有些只是默认在最后添加一个新值。维护插入顺序仅在您通过它对对象进行优先级排序或使用它以某种方式对对象进行排序时才有用。

至于为什么有些集合默认维护它而其他集合没有,这主要是由实现引起的,有时只是集合定义的一部分。

  • 列表维护广告订单顺序,因为在结尾或开头添加新条目是add(Object)方法的最快实现。

  • HashSet和TreeSet实现不维护插入顺序,因为对象的排序是为了快速查找,维护插入顺序需要额外的内存。这导致性能增益,因为插入顺序几乎从不对集合感兴趣。

  • ArrayDeque 一个deque可以用于简单的que和stack,所以你想要'先进先出''或''先进先出''的行为,都要求ArrayDeque维护插入顺序。在这种情况下,插入顺序将作为类合同的中心部分进行维护。

答案 2 :(得分:7)

  • 插入顺序本身并未在hash tables中维护 - 这就是它们的工作原理(阅读链接文章以了解详细信息)。可以添加逻辑来维护插入顺序(如LinkedHashMap中所示),但这会占用更多代码,并且在运行时会有更多内存和更多时间。性能损失通常不大,但可以是。
  • 对于TreeSet/Map,使用它们的主要原因是自然迭代顺序和SortedSet/Map界面中添加的其他功能。

答案 3 :(得分:2)

取决于您需要实施哪些方面做得好。插入顺序通常不是很有趣,因此无需维护它,因此您可以重新排列以获得更好的性能。

对于地图,通常使用HashMap和TreeMap。通过使用哈希码,可以将条目放在易于搜索的小组中.TreeMap以较慢的搜索为代价维护插入条目的排序顺序,但比HashMap更容易排序。

答案 4 :(得分:2)

当您使用HashSet(或HashMap)时,数据会根据您对象的哈希值存储在“桶”中。这样您的数据就更容易访问,因为您不必在整个Set中查找此特定数据,只需要查看正确的数据库。

通过这种方式,您可以提高特定点的表现。

每个Collection实现都有其特殊性,可以更好地在特定条件下使用。每个特殊性都有成本。因此,如果您真的不需要它(例如插入顺序),您最好使用不提供它的实现,并且更符合您的要求。

答案 5 :(得分:0)

为什么有必要维持插入顺序?如果您使用HashMap,则可以key获取条目。这并不意味着它不提供满足你想要的类。

答案 6 :(得分:0)

Theres是O'Reilly Java Cookbook中的一个部分,名为“避免排序的冲动”你应该问的问题实际上与你原来的问题相反......“我们通过排序获得了什么?”排序和维护该订单需要花费很多精力。确定排序很容易,但在大多数程序中通常无法扩展。如果你要每秒处理成千上万或数万个请求(insrt,del,get等),那么你是否正在使用已排序或非排序的数据结构是非常重要的。

答案 7 :(得分:0)

由于某些Collection不维护订单,因此会计算内容的hashCode并将其相应地存储在相应的存储桶中。

答案 8 :(得分:-1)

我无法引用引用,但按设计,List接口的SetCollection实现基本上是可扩展的Array。默认情况下,Collections提供了在任何时候动态添加删除元素的方法 - Array没有 - 插入顺序可能不被保留。 因此,由于存在更多用于内容操纵的方法,因此需要保持顺序的特殊实现。

另一点是性能,因为效果最好的Collection可能不是,它会保留其插入顺序。但我不确定,Collections如何管理其内容以提高性能。

因此,简而言之,我可以想到为什么存在保留订单Collection的两个主要原因是:

  1. 班级架构
  2. 性能

答案 9 :(得分:-1)

好的......所以这些帖子与现在相比较旧,但根据您的需要或应用程序要求需要插入顺序,因此只需使用正确的集合类型即可。在大多数情况下,它不是必需的,但在需要按照存储顺序使用对象的情况下,我看到了一定的需求。我认为当您创建例如向导或流引擎或某种性质的东西时,顺序很重要,您需要从一个州到另一个州。从这个意义上讲,您可以从列表中读取内容,而无需跟踪下一步所需内容或遍历列表以查找所需内容。从这个意义上讲,它确实有助于提升性能它确实很重要,否则这些收藏就没有多大意义。