在这个问题中,如何在C ++ 11中有效地选择标准库容器?是选择C ++集合时要使用的便捷流程图。
我认为对于那些不确定应该使用哪个集合的人来说,这是一个有用的资源,因此我试图找到类似的Java流程图,但未能做到。
哪些资源和“备忘单”可用来帮助人们选择使用Java进行编程时要使用的正确Collection?人们如何知道应该使用哪些List,Set和Map实现?
在这个问题中,如何在C ++ 11中有效地选择标准库容器?是选择C ++集合时要使用的便捷流程图。
我认为对于那些不确定应该使用哪个集合的人来说,这是一个有用的资源,因此我试图找到类似的Java流程图,但未能做到。
哪些资源和“备忘单”可用来帮助人们选择使用Java进行编程时要使用的正确Collection?人们如何知道应该使用哪些List,Set和Map实现?
Answers:
由于找不到相似的流程图,我决定自己制作一个。
该流程图未尝试涵盖同步访问,线程安全性或旧版集合等内容,但确实涵盖了3个标准Set,3个标准Map和2个标准List。
此图像是为此答案创建的,并根据知识共享署名4.0国际许可获得许可。最简单的归因是通过链接到此问题或此答案。
其他资源
可能最有用的其他参考是oracle文档的以下页面,该页面描述了每个Collection。
HashSet与TreeSet
关于何时使用HashSet
或TreeSet
在此处进行详细讨论:
Hashset与Treeset
ArrayList与LinkedList
LinkedList
vs ArrayList
决定。首先,如果列表很大,LinkedList
则是可取的。LinkedList
具有每个元素的开销,因此就内存消耗而言,它的渐近性要比差ArrayList
。同样,如果大多数访问都在列表的末尾,则an ArrayList
是可取的,因为它提供了恒定时间的随机元素访问。访问a的n
th元素LinkedList
是一个O(n)
操作。...实际上,使用链接列表的决定几乎总是 “不”。
LinkedList
是一个双链表,因此开始和结束时的访问速度都很快。您会注意到,在我建议使用LinkedList
- 之前,所有三个问题中的分支都必须回答“是” ,因此换句话说,我同意您的看法,在大多数情况下,答案为“否”。诸如队列和出队之类的事情,您需要不断地从列表区域的末端添加和删除事物,这是很好的用例LinkedList
。
LinkedList
每个元素使用更多内存... ArrayList
永远不会释放内存。这意味着,如果您的列表有时会变得很大,但通常很小,那么ArrayList
内存性能就会下降。List
与其本身所包含的元素相比,其自身的内存开销通常(尽管并不总是)较小。
Map<K,V>
不属于java.util.collection
Collection
:表示无序的“袋”物品的接口,称为“元素”。“下一个”元素未定义(随机)。
Set
:表示的接口Collection
,没有重复项。
HashSet
:Set
由Hashtable
。当订购不重要时,最快和最小的内存使用情况。LinkedHashSet
:A,HashSet
带有一个链接列表,以插入顺序关联元素。“下一个”元素是最近插入的元素。TreeSet
:,Set
其中元素按Comparator
(通常是自然排序)排序。最慢和最大的内存使用情况,但对于基于比较器的排序是必需的。EnumSet
:Set
针对单个枚举类型的极其快速和高效的定制。List
:一个表示Collection
的元素的接口,每个元素都有序,每个都有一个数字索引来表示其位置,其中第一个元素为零,(length - 1)
最后一个元素。
ArrayList
:List
由数组支持,其中数组的长度(称为“容量”)至少与元素数(列表的“大小”)一样大。当大小超出容量时((capacity + 1)-th
添加元素时),将以新容量-重新创建阵列-这种重新创建(new length * 1.5)
很快,因为它使用System.arrayCopy()
。删除和插入/添加元素需要将所有相邻元素(在右侧)移入或移出该空间。访问任何元素都是快速的,因为只需要计算(element-zero-address + desired-index * element-size)
即可找到其位置。在大多数情况下,ArrayList
优先于LinkedList
。LinkedList
:List
由一组对象支持,每个对象都链接到其“上一个”和“下一个”邻居。A LinkedList
也是Queue
和Deque
。从第一个或最后一个元素开始访问元素,然后遍历直到达到所需的索引。一旦通过遍历达到了所需的索引,插入和删除就变成了一个琐碎的事:仅重新映射直接邻居链接以指向新元素或绕过现在删除的元素。Map
:表示Collection
每个元素都有一个标识“键”的接口,每个元素都是一个键值对。
HashMap
:,Map
其中的键是无序的,并带有Hashtable
。LinkedhashMap
:密钥按插入顺序排序。TreeMap
:,Map
其中键是按Comparator
(通常是自然排序)排序的。Queue
:一个表示a Collection
元素的接口,通常将元素添加到一端,然后从另一端删除(FIFO:先进先出)。Stack
:表示一个Collection
通常在其中从同一端添加(推送)和删除(弹出)元素的位置的接口(LIFO:后进先出)。Deque
:“双头队列”的缩写,通常发音为“ deck”。链表通常仅添加到两端(而不是中间)并从中读取。基本收集图:
将元素的插入与ArrayList
和进行比较LinkedList
:
更简单的图片在这里。故意简化!
集合是保存称为“元素”(相同类型)的数据的任何东西。没有更具体的假设。
列表是数据的索引集合,其中每个元素都有一个索引。类似于数组的东西,但更灵活。
列表中的数据保持插入顺序。
典型操作:获取第n个元素。
集合是一袋元素,每个元素仅出现一次(元素通过使用equals()
方法。
集中存储数据的目的仅仅是为了知道那里有什么数据。
典型操作:判断列表中是否存在元素。
Map类似于List,但是您不是通过整数索引访问元素,而是通过 key(任何对象)访问它们。就像PHP中的数组一样:)
Map中的数据可通过其关键字进行搜索。
典型的操作:通过其ID(其中ID是任何类型,不仅int
是List的情况)来获取元素。
设置并映射:在“设置”中,您可以自己搜索数据,而在“地图”中,可以按其键。
列表和地图:在列表中,您可以通过元素的int
索引(列表中的位置)访问元素,而在地图中,可以通过其键访问任意类型的元素(通常是ID)
列表和集合:在列表中,元素受其位置限制并且可以重复,而在集合中,元素只是“存在”(pr不存在)并且是唯一的(在equals()
或中compareTo()
表示SortedSet
)
这很简单:如果您需要存储映射了键的值,请转到Map接口,否则,请使用List表示可能重复的值,如果不想在集合中使用重复的值,请最终使用Set接口。
这是http://javatutorial.net/choose-the-right-java-collection的完整说明,包括流程图等
我应该使用哪个Java Collection?
这取决于您要解决的问题或您有什么要求。
例子 :