Java集合维护插入顺序

Jav*_*ser 48 java collections data-structures

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

use*_*421 77

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

  • Where does `ArrayList` fit in the answer? (9认同)

jos*_*efx 18

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

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

  • 列表维护插入顺序,因为只是在结尾处添加新条目,或者开头是add(Object)方法的最快实现.

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

  • ArrayDeque deque可用于简单的que和stack,因此你想要"先进先出"或"先进去"行为,这两者都要求ArrayDeque保持插入顺序.在这种情况下,插入顺序将作为类合同的中心部分进行维护.

  • 非常有用,特别是关于ArrayDeque. (4认同)

Mic*_*rdt 7

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

  • +1提及"但需要更多代码". (2认同)