我应该使用哪个 Java 集合?主要非并发、非同步集合的摘要

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

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

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


答案 1

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

此流程图不会尝试涵盖同步访问,线程安全等或遗留集合之类的内容,但它确实涵盖了3个标准Sets,3个标准Maps和2个标准Lists。

enter image description here

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

其他资源

也许最有用的其他参考是oracle文档中的以下页面,其中描述了每个集合

哈希集与树集

有关于何时使用的详细讨论或在这里:Hashset vs TreesetHashSetTreeSet

ArrayList vs LinkedList

详细讨论:何时使用LinkedList而不是ArrayList?


答案 2

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

集合:表示无序项目“包”的界面,称为“元素”。“next”元素是未定义的(随机的)。

  • Set:表示没有重复项的 的接口。Collection
  • List:表示 其元素排序的接口,每个接口都有一个表示其位置的数字索引,其中零是第一个元素,并且是最后一个元素。Collection(length - 1)
    • ArrayList:由数组支持的数组,其中数组的长度(称为“容量”)至少与元素数(列表的“大小”)一样大。当大小超过容量时(当添加元素时),将使用新的容量 --这种重新创建速度很快,因为它使用 System.arrayCopy()。删除和插入/添加元素需要将所有相邻元素(右侧)移入或移出该空间。访问任何元素都很快,因为它只需要计算即可找到它的位置。在大多数情况下,首选 a 而不是 .List(capacity + 1)-th(new length * 1.5)(element-zero-address + desired-index * element-size)ArrayListLinkedList
    • LinkedList:由一组对象支持,每个对象都链接到其“上一个”和“下一个”邻居。A 也是一个 和 。访问元素从第一个或最后一个元素开始,然后遍历,直到达到所需的索引。插入和删除,一旦通过遍历到达所需的索引,只需重新映射直接邻居链接以指向新元素或绕过现在删除的元素即可。ListLinkedListQueueDeque
  • Map:一个表示的接口,其中每个元素都有一个标识“键” - 每个元素都是一个键值对。Collection
    • HashMap:一种,其中键是无序的,并由 .MapHashtable
    • LinkedhashMap:键按广告顺序排序
    • 树状图:按 a 排序键的 A(通常为自然排序)。MapComparator
  • Queue:一个接口,表示元素通常添加到一端,并从另一端删除(FIFO:先进先出)。Collection
  • 堆栈:一个接口,表示元素通常从同一端添加(推送)和删除(弹出)(LIFO:后进先出)。Collection
  • Deque:“双端队列”的缩写,通常发音为“deck”。通常仅添加到任一端(而不是中间端)并从中读取的链接列表。

基本收集图:

diagram

将元素的插入与 和 进行比较:ArrayListLinkedList

diagram