我应该使用哪个Java Collection?

时间:2014-02-23 20:53:00

标签: java algorithm arraylist collections hashmap

在这个问题中,How can I efficiently select a Standard Library container in C++11?是一个在选择C ++集合时使用的便捷流程图。

我认为这对于那些不确定应该使用哪个集合的人来说是一个有用的资源,所以我试图找到类似Java的流程图,但是无法这样做。

有哪些资源和“备忘单”可以帮助人们选择在Java编程时使用的正确集合?人们如何知道应该使用哪些List,Set和Map实现?

7 个答案:

答案 0 :(得分:253)

由于我找不到类似的流程图,我决定自己制作一个。

此流程图不会尝试涵盖同步访问,线程安全等内容或旧版集合,但它确实涵盖了3个标准 s,3个标准 Map s和2标准列表 s。

enter image description here

此图片是为此答案创建的,并在Creative Commons Attribution 4.0 International License.下获得许可。最简单的归因是链接到此问题或此答案。

其他资源

最有用的其他参考可能是oracle文档中的以下页面,其中描述了每个Collection

HashSet与TreeSet

详细讨论了何时使用HashSetTreeSetHashset vs Treeset

ArrayList与LinkedList

详细讨论:When to use LinkedList over ArrayList?

答案 1 :(得分:54)

主要非并发,非同步集合的摘要

Collection:代表无序"包的接口"项目,称为"元素"。 "下一个"元素未定义(随机)。

  • Set:表示Collection且没有重复的接口。
    • HashSet:由Hashtable支持的Set。订购时最快和最小的内存使用量并不重要。
    • LinkedHashSetHashSet添加了一个链接列表,用于关联广告订单中的元素。 "下一个" element是下一个最近插入的元素。
    • TreeSetSet其中元素按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 situationsArrayList优先于LinkedList
    • LinkedList:由一组对象支持的List,每个对象都链接到"之前的"和" next"邻居。 LinkedList也是QueueDeque。从第一个或最后一个元素开始访问元素,并遍历直到达到所需的索引。插入和删除一旦通过遍历到达所需的索引,只需重新映射直接邻居链接以指向新元素或绕过现在删除的元素。
  • Map:表示Collection的接口,其中每个元素都有一个标识"键" - 每个元素都是一个键值对。
    • HashMapMap,其中密钥无序,并由Hashtable支持。
    • LinkedhashMap:密钥按广告订单排序。
    • TreeMapMap其中键按Comparator排序(通常是自然排序)。
  • Queue:一个代表Collection的接口,其中元素通常添加到一端,并从另一端移除(FIFO:先进先出)。
  • Stack:一个代表Collection的接口,其中元素通常从同一端添加(推送)和删除(弹出)(LIFO:last-in,first-out)
  • Deque:"双端队列"的缩写,通常发音为" deck"。通常只添加到任一端(而不是中间)的链接列表。

基本集合图:

diagram

比较元素与ArrayListLinkedList

的插入情况

diagram

答案 2 :(得分:10)

这里的图片更简单。故意简化!

  1. 集合是指包含数据"元素" (相同类型)。没有更具体的假设。

  2. 列表索引数据集合,其中每个元素都有一个索引。像数组一样,但更灵活。

    列表中的数据保持插入顺序。

  3. 设置元素包,每个元素只需一次(使用equals()方法区分元素。

    集合中的数据主要用于了解有哪些数据。

  4. Map 类似于List,但不是通过整数索引访问元素,而是通过(任何对象)访问它们。就像PHP中的数组一样:)

    地图中的数据可以通过密钥进行搜索。

    Set和Map 之间的主要区别在于你自己设置搜索数据 ,而在地图中 >按他们的钥匙

答案 3 :(得分:1)

很简单:如果您需要存储映射到它们的键的值,请转到Map接口,否则使用List作为可能重复的值,如果您不希望在集合中使用重复值,则最后使用Set接口。

以下是完整的解释http://javatutorial.net/choose-the-right-java-collection,包括流程图等

答案 4 :(得分:1)

地图

如果选择Map,那么我制作了此表,总结了与Java 11捆绑在一起的十种实现的每一种的功能。

A table listing the ten implementations of <code>Map</code> bundled with Java 11, and comparing their features, pros, and cons.

答案 5 :(得分:0)

常用收藏,常用收藏 enter image description here

答案 6 :(得分:-1)

我应该使用哪个Java Collection?

这取决于您要解决的问题或您有什么要求。

示例:

  1. 是否要在存储元素时对它们进行排序? 哈希集
  2. 是否要存储(键,值)对? HashMap
  3. 是否要保留插入时元素的顺序? ArrayList,LinkedList
  4. 是否要对(键,值)对中的键进行排序? - strong文字
  5. 您要实现一个堆栈来解决您的问题吗? -堆栈
  6. 是否要具有FIFO(先进先出)访问权限? -队列
  7. 是否只希望存储UNIQUE元素? -哈希集
  8. 是否要在存储(Key,Value)时允许键为“ Null”? - HashMap
  9. 您是否想要(Key,Value)对没有NULL值? 哈希表