数据结构-维护插入ord的Java集合
为什么某些集合数据结构不能保持插入顺序? 与保持插入顺序相比,有什么特别的事情?如果我们不维持订单,我们会有所收获吗?
10个解决方案
77 votes
性能。 如果您想要原始的插入顺序,则可以使用LinkedXXX类,它们在插入顺序中维护着一个附加的链表。 大多数时候,您都不在乎,因此您使用HashXXX,或者想要自然订单,因此您使用TreeXXX。 在这两种情况下,您为什么都要支付链接列表的额外费用?
user207421 answered 2020-02-15T05:55:27Z
18 votes
集合不保持插入顺序。 有些只是默认在末尾添加一个新值。 仅当您按插入对象的优先级或使用它以某种方式对对象进行排序时,保持插入顺序才有用。
至于为什么有些集合默认情况下维护它,而另一些默认情况下则不维护,这主要是由实现引起的,并且有时仅是集合定义的一部分。
列表保持插入顺序,因为仅在末尾或开头添加新条目是add(Object)方法的最快实现。
集合HashSet和TreeSet实现不维护插入顺序,因为对对象进行了排序以进行快速查找,并且维护插入顺序将需要额外的内存。 由于插入顺序对于Set几乎从来都不是有趣的,因此可以提高性能。
ArrayDeque一个双端队列可以用于简单的队列和堆栈,因此您要具有“先进先出”或“先进先出”的性能,两者都需要ArrayDeque保持插入顺序。 在这种情况下,插入顺序将作为类合同的中心部分维护。
josefx answered 2020-02-15T05:56:07Z
7 votes
插入顺序本质上不在哈希表中维护-而是它们的工作方式(请阅读链接的文章以了解详细信息)。 可以添加逻辑来维护插入顺序(如LinkedHashMap中所示),但这需要更多的代码,并且在运行时需要更多的内存和更多的时间。 性能损失通常不大,但是可以。
对于TreeSet/Map,使用它们的主要原因是自然迭代顺序和SortedSet/Map接口中添加的其他功能。
Michael Borgwardt answered 2020-02-15T05:56:33Z
2 votes
取决于您需要执行什么才能做好。 插入顺序通常并不有趣,因此无需维护它,因此您可以重新排列以获得更好的性能。
对于地图,通常使用HashMap和TreeMap。 通过使用哈希码,可以将条目分成小组,以便于搜索。TreeMap维护插入条目的排序顺序,但代价是搜索速度较慢,但比HashMap排序容易。
Thorbjørn Ravn Andersen answered 2020-02-15T05:56:58Z
2 votes
使用HashSet(或HashMap)时,数据将基于对象的哈希存储在“存储桶”中。 这样一来,您的数据将更易于访问,因为您不必在整个集合中查找此特定数据,而只需要在正确的存储桶中查找即可。
这样,您可以提高特定点的性能。
每个Collection实现都有其特殊性,可以更好地在特定条件下使用。 这些特性中的每一个都有成本。 因此,如果您真的不需要它(例如插入顺序),则最好使用一种不提供它且更适合您需求的实现。
Colin Hebert answered 2020-02-15T05:57:27Z
0 votes
为什么必须保持插入顺序? 如果使用HashMap,则可以通过key获得该条目。这并不意味着它不提供满足您所需的类。
fastcodejava answered 2020-02-15T05:57:47Z
0 votes
O'Reilly Java Cookbook中有一个名为“避免排序的冲动”的部分,实际上,您应该问的问题与原始问题相反:“我们通过排序获得了某些东西吗?” 排序和维护该顺序需要大量的精力。 当然排序很容易,但是在大多数程序中通常无法扩展。 如果您每秒要处理成千上万的请求(insrt,del,get等),那么无论您使用的是排序数据结构还是非排序数据结构都将变得至关重要。
brown.2179 answered 2020-02-15T05:58:09Z
0 votes
由于某些Collection不能保持顺序,因此它们计算内容的hashCode并将其相应地存储在适当的存储桶中。
Abhishek Singh answered 2020-02-15T05:58:29Z
-1 votes
我引用不了,但是通过设计Collection接口的2748252679679976780800和Collections实现基本上是可扩展的Arrays。 由于默认情况下Collections提供了在任意点动态添加和删除元素的方法(而Array则没有),因此可能不会保留插入顺序。因此,由于存在更多用于内容操纵的方法,因此需要确实保留顺序的特殊实现。
另一个要点是性能,因为性能最好的Collection可能并非如此,它可以保留其插入顺序。 但是,我不确定Collections如何准确地管理其内容以提高性能。
简而言之,我能想到为什么保留订单Collection实现的两个主要原因是:
类架构
性能
FK82 answered 2020-02-15T05:59:08Z
-1 votes
好的...所以这些帖子与现在相比已经过时了,但是根据您的需要或应用程序需求需要插入顺序,因此只需使用正确的收藏类型即可。 在大多数情况下,这不是必需的,但是在需要按对象存储的顺序使用对象的情况下,我看到了一定的需求。 我认为在您创建向导或流程引擎之类的东西时,顺序很重要,而这种性质的东西您需要从一个州到另一个州去。 从这种意义上说,您可以从列表中读取内容,而无需跟踪下一步需要什么或遍历列表以查找所需内容。 从某种意义上说,它确实有助于提高性能。 确实很重要,否则这些收藏将没有多大意义。
Beaumont answered 2020-02-15T05:59:29Z