我应该使用哪个Java Collection?

Tim*_*m B 121 java algorithm collections arraylist hashmap

在这个问题中如何在C++ 11中有效地选择标准库容器?是一个在选择C++集合时使用的方便流程图.

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

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

Tim*_*m B 275

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

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

在此输入图像描述

此图片是为此答案而创建的,并根据知识共享署名4.0国际许可进行许可.最简单的归因是链接到这个问题或这个答案.

其他资源

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

HashSet与TreeSet

有关何时使用HashSetTreeSet此处的详细讨论: Hashset与Treeset

ArrayList与LinkedList

详细讨论:何时使用LinkedList over ArrayList?

  • @MattBall我在很大程度上同意你的观点.但是Java`RubdingList`是一个双链表,因此在开始和结束时访问都很快.你会注意到,在我推荐使用`LinkedList`之前,所有三个问题必须回答是 - 所以换句话说我同意你的观点,在大多数情况下答案是否定的.诸如队列和队列之类的东西,你不断添加和删除列表区域末端的东西是"LinkedList"的良好用例. (2认同)

ali*_*ind 65

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

Collection:表示项目的无序"包"的接口,称为"元素"."next"元素未定义(随机).

  • Set:表示Collection没有重复项的接口.
    • HashSet:一个Set支持Hashtable.订购时最快和最小的内存使用量并不重要.
    • LinkedHashSet:A HashSet添加了一个链接列表,用于按插入顺序关联元素."next"元素是最近插入的元素.
    • 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)就可以找到它的位置.在大多数情况下,ArrayLista优于a LinkedList.
    • LinkedList:List由一组对象支持,每个对象链接到其"前一个"和"下一个"邻居.A LinkedList也是QueueDeque.从第一个或最后一个元素开始访问元素,并遍历直到达到所需的索引.一旦通过遍历到达所需索引,插入和删除是一个简单的问题,即只重新映射直接邻居链接以指向新元素或绕过现在删除的元素.
  • Map:表示Collection每个元素具有标识"键" 的位置的接口- 每个元素是键值对.
    • HashMap:Map键是无序的,并由a支持Hashtable.
    • LinkedhashMap:键按插入顺序排序.
    • TreeMap:Map按键排序的位置Comparator(通常是自然排序).
  • Queue:一个接口,表示Collection元素通常添加到一端,并从另一端移除(FIFO:先进先出).
  • Stack:一个接口,表示Collection通常从同一端添加(推送)和删除(弹出)元素的位置(LIFO:last-in,first-out).
  • Deque:"双端队列"的缩写,通常发音为"deck".通常仅添加到任一端(而不是中间)的链接列表.

基本集合图:

图

比较元素与ArrayList和的插入LinkedList:

图

  • 最简单的总结一个人可以到任何地方:) (2认同)

Hon*_*dek 11

更简单的图片就在这里.故意简化!

  1. 集合是包含称为"元素"(相同类型)的数据的任何东西.没有更具体的假设.

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

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

  3. Set是一包元素,每个元素只有一次(元素使用他们的equals()方法区分.

    存储集中的数据主要是为了知道那里有什么数据.

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

    地图中的数据可通过其密钥进行搜索.

    Set和Map之间的主要区别在于 Set中您自己搜索数据,而在地图中按键.