我应该使用哪个 Java 集合?主要非并发、非同步集合的摘要
2022-08-31 07:51:49
在这个问题中,如何在C++11中有效地选择标准库容器?是选择C++集合时使用的方便的流程图。
我认为对于那些不确定他们应该使用哪个集合的人来说,这是一个有用的资源,所以我试图为Java找到一个类似的流程图,但无法做到这一点。
有哪些资源和“备忘单”可以帮助人们在Java编程时选择正确的集合?人们如何知道他们应该使用什么列表,集合和映射实现?
在这个问题中,如何在C++11中有效地选择标准库容器?是选择C++集合时使用的方便的流程图。
我认为对于那些不确定他们应该使用哪个集合的人来说,这是一个有用的资源,所以我试图为Java找到一个类似的流程图,但无法做到这一点。
有哪些资源和“备忘单”可以帮助人们在Java编程时选择正确的集合?人们如何知道他们应该使用什么列表,集合和映射实现?
由于我找不到类似的流程图,我决定自己制作一个。
此流程图不会尝试涵盖同步访问,线程安全等或遗留集合之类的内容,但它确实涵盖了3个标准Sets,3个标准Maps和2个标准Lists。
此图像是为此答案而创建的,并根据知识共享署名4.0国际许可协议进行许可。最简单的归因是链接到这个问题或这个答案。
其他资源
也许最有用的其他参考是oracle文档中的以下页面,其中描述了每个集合。
哈希集与树集
有关于何时使用的详细讨论或在这里:Hashset vs TreesetHashSet
TreeSet
ArrayList vs LinkedList
集合
:表示无序项目“包”的界面,称为“元素”。“next”元素是未定义的(随机的)。
Set
:表示没有重复项的 的接口。Collection
HashSet
:由 Hashtable 支持的。
最快和最小的内存使用量,当订购不重要时。Set
LinkedHashSet
:添加链接列表以按插入顺序关联元素的 A。“next”元素是最近插入的下一个元素。HashSet
TreeSet
:元素由比较器
排序(通常为自然排序)的一种。最慢和最大的内存使用量,但对于基于比较器的排序是必需的。Set
枚举集
:为单个枚举类型定制的极其快速和高效的方法。Set
List
:表示 其元素排序的接口,每个接口都有一个表示其位置的数字索引,其中零是第一个元素,并且是最后一个元素。Collection
(length - 1)
ArrayList
:由数组支持的数组,其中数组的长度(称为“容量”)至少与元素数(列表的“大小”)一样大。当大小超过容量时(当添加元素时),将使用新的容量 --这种重新创建速度很快,因为它使用 System.arrayCopy()。
删除和插入/添加元素需要将所有相邻元素(右侧)移入或移出该空间。访问任何元素都很快,因为它只需要计算即可找到它的位置。在大多数情况下,首选 a 而不是 .List
(capacity + 1)-th
(new length * 1.5)
(element-zero-address + desired-index * element-size)
ArrayList
LinkedList
LinkedList
:由一组对象支持,每个对象都链接到其“上一个”和“下一个”邻居。A 也是一个 和 。访问元素从第一个或最后一个元素开始,然后遍历,直到达到所需的索引。插入和删除,一旦通过遍历到达所需的索引,只需重新映射直接邻居链接以指向新元素或绕过现在删除的元素即可。List
LinkedList
Queue
Deque
Map
:一个表示的接口,其中每个元素都有一个标识“键” - 每个元素都是一个键值对。Collection
HashMap
:一种,其中键是无序的,并由 .Map
Hashtable
LinkedhashMap
:键按广告顺序排序。树状图
:按 a 排序键的 A(通常为自然排序)。Map
Comparator
Queue
:一个接口,表示元素通常添加到一端,并从另一端删除(FIFO:先进先出)。Collection
堆栈
:一个接口,表示元素通常从同一端添加(推送)和删除(弹出)(LIFO:后进先出)。Collection
Deque
:“双端队列”的缩写,通常发音为“deck”。通常仅添加到任一端(而不是中间端)并从中读取的链接列表。基本收集图:
将元素的插入与 和 进行比较:ArrayList
LinkedList