在这个问题中,How can I efficiently select a Standard Library container in C++11?是一个在选择C ++集合时使用的便捷流程图。
我认为这对于那些不确定应该使用哪个集合的人来说是一个有用的资源,所以我试图找到类似Java的流程图,但是无法这样做。
有哪些资源和“备忘单”可以帮助人们选择在Java编程时使用的正确集合?人们如何知道应该使用哪些List,Set和Map实现?
答案 0 :(得分:253)
由于我找不到类似的流程图,我决定自己制作一个。
此流程图不会尝试涵盖同步访问,线程安全等内容或旧版集合,但它确实涵盖了3个标准集 s,3个标准 Map s和2标准列表 s。
此图片是为此答案创建的,并在Creative Commons Attribution 4.0 International License.下获得许可。最简单的归因是链接到此问题或此答案。
其他资源
最有用的其他参考可能是oracle文档中的以下页面,其中描述了每个Collection。
HashSet与TreeSet
详细讨论了何时使用HashSet
或TreeSet
:
Hashset vs Treeset
ArrayList与LinkedList
答案 1 :(得分:54)
Collection
:代表无序"包的接口"项目,称为"元素"。 "下一个"元素未定义(随机)。
Set
:表示Collection
且没有重复的接口。
HashSet
:由Hashtable
支持的Set
。订购时最快和最小的内存使用量并不重要。LinkedHashSet
:HashSet
添加了一个链接列表,用于关联广告订单中的元素。 "下一个" element是下一个最近插入的元素。TreeSet
:Set
其中元素按Comparator
排序(通常为natural ordering)。最慢和最大的内存使用量,但对于基于比较器的排序是必需的。EnumSet
:针对单个枚举类型定制的极其快速且高效的Set
。List
:一个表示Collection
的接口,其元素是有序的,每个元素都有一个表示其位置的数字索引,其中0是第一个元素,(length - 1)
是最后一个元素。
ArrayList
:由数组支持的List
,其中数组的长度(称为"容量")至少与元素数量一样大(列表"尺寸")。当大小超过容量时(添加(capacity + 1)-th
元素时),将使用新容量(new length * 1.5)
重新创建数组 - 此重新创建速度很快,因为它使用System.arrayCopy()
。删除和插入/添加元素需要将所有相邻元素(右侧)移入或移出该空间。访问任何元素都很快,因为它只需要计算(element-zero-address + desired-index * element-size)
来查找它的位置。 In most situations,ArrayList
优先于LinkedList
。LinkedList
:由一组对象支持的List
,每个对象都链接到"之前的"和" next"邻居。 LinkedList
也是Queue
和Deque
。从第一个或最后一个元素开始访问元素,并遍历直到达到所需的索引。插入和删除一旦通过遍历到达所需的索引,只需重新映射直接邻居链接以指向新元素或绕过现在删除的元素。Map
:表示Collection
的接口,其中每个元素都有一个标识"键" - 每个元素都是一个键值对。
HashMap
:Map
,其中密钥无序,并由Hashtable
支持。LinkedhashMap
:密钥按广告订单排序。TreeMap
:Map
其中键按Comparator
排序(通常是自然排序)。Queue
:一个代表Collection
的接口,其中元素通常添加到一端,并从另一端移除(FIFO:先进先出)。Stack
:一个代表Collection
的接口,其中元素通常从同一端添加(推送)和删除(弹出)(LIFO:last-in,first-out) Deque
:"双端队列"的缩写,通常发音为" deck"。通常只添加到任一端(而不是中间)的链接列表。基本集合图:
比较元素与ArrayList
和LinkedList
:
答案 2 :(得分:10)
这里的图片更简单。故意简化!
集合是指包含数据"元素" (相同类型)。没有更具体的假设。
列表是索引数据集合,其中每个元素都有一个索引。像数组一样,但更灵活。
列表中的数据保持插入顺序。
设置是元素包,每个元素只需一次(使用equals()
方法区分元素。
集合中的数据主要用于了解有哪些数据。
Map 类似于List,但不是通过整数索引访问元素,而是通过键(任何对象)访问它们。就像PHP中的数组一样:)
地图中的数据可以通过密钥进行搜索。
Set和Map 之间的主要区别在于你自己设置搜索数据 ,而在地图中 >按他们的钥匙。
答案 3 :(得分:1)
很简单:如果您需要存储映射到它们的键的值,请转到Map接口,否则使用List作为可能重复的值,如果您不希望在集合中使用重复值,则最后使用Set接口。
以下是完整的解释http://javatutorial.net/choose-the-right-java-collection,包括流程图等
答案 4 :(得分:1)
答案 5 :(得分:0)
答案 6 :(得分:-1)
我应该使用哪个Java Collection?
这取决于您要解决的问题或您有什么要求。
示例: