我应该使用什么Java集合?
在这个问题如何有效地select在C + + 11标准库容器? 是selectC ++集合时使用的方便的stream程图。
我认为这对于那些不确定应该使用哪个集合的人来说是一个有用的资源,所以我试图find一个类似于Java的stream程图,并且无法做到这一点。
什么资源和“备忘单”可用于帮助人们select正确的集合在Java编程时使用? 人们如何知道他们应该使用什么List,Set和Map实现?
由于找不到类似的stream程图,我决定自己做一个。
这个stream程图并没有试图涵盖同步访问,线程安全等等或者传统的集合,但是它包含了3个标准集合 ,3个标准映射和2个标准列表 。
这个图像是为这个答案而创build的,是根据知识共享署名4.0国际许可证授权的。 最简单的归因是链接到这个问题或这个答案。
其他资源
可能最有用的其他参考资料是来自描述每个集合的oracle文档的以下页面。
HashSet vs TreeSet
下面详细讨论何时使用HashSet
或TreeSet
: Hashset vs Treeset
ArrayList vs LinkedList
详细的讨论: 什么时候通过ArrayList使用LinkedList?
主要的非并发,非同步收集摘要
Collection
:表示无序的“包”项的接口,称为“元素”。 “下一个”元素是未定义的(随机)。
-
Set
:代表一个Collection
没有重复的接口。-
HashSet
:一个由Hashtable
支持的Set
。 订购时最快和最小的内存使用量并不重要。 -
LinkedHashSet
:一个HashSet
,添加一个链接列表来关联元素的插入顺序 。 “下一个”元素是下一个最近插入的元素。 -
TreeSet
:元素由Comparator
sorting的Set
(通常是自然sorting )。 最慢和最大的内存使用情况,但对于基于比较器的sorting来说是必需的 - 枚举
Set
为单枚枚举types定制的极其快速高效的Set
。
-
-
List
:一个接口,表示一个Collection
其元素是有序的,每个接口都有一个数字索引来表示它的位置,其中零是第一个元素,(length - 1)
是最后一个。-
ArrayList
:由数组支持的List
,其中数组的长度(称为“容量”)至less与元素数量(列表的“大小”)一样大。 当大小超过容量时(当第(capacity + 1)-th
元素被添加时),以新的容量(new length * 1.5)
重新创build数组 – 由于使用System.arrayCopy()
,重新创build是快速的。 删除和插入/添加元素需要将所有相邻元素(右侧)移入或移出该空间。 访问任何元素是快速的,因为它只需要计算(element-zero-address + desired-index * element-size)
来find它的位置。 在大多数情况下 ,ArrayList
比LinkedList
。 -
LinkedList
:由一组对象支持的List
,每个对象链接到它的“上一个”和“下一个”邻居。LinkedList
也是一个Queue
和Deque
。 访问元素从第一个元素或最后一个元素开始,遍历直到达到所需的索引。 一旦通过遍历达到期望的索引 ,插入和删除就是只重新映射直接相邻链接指向新元素或绕过现在被删除的元素的一个微不足道的问题。
-
-
Map
:表示Collection
的接口,其中每个元素都有一个标识“键” – 每个元素都是一个键值对。-
HashMap
:密钥无序且由Hashtable
支持的Map
。 -
LinkedhashMap
:按照sorting顺序sorting 。 -
TreeMap
:一个Map
,其中键由Comparator
sorting(通常是自然sorting)。
-
-
Queue
:表示一个Collection
的接口,其中元素通常被添加到一端,并从另一端移除(FIFO:先进先出)。 -
Stack
:一个接口,表示一个Collection
,其中的元素通常都是从同一端(LIFO:后进先出)添加(推送)和删除(popup)。 -
Deque
:“双排队列”的Deque
,通常发音为“甲板”。 链接列表通常只添加到任何一端(而不是中间)。
基本收集图表:
比较元素与ArrayList
和LinkedList
的插入:
更简单的画面就在这里。 故意简化!
-
集合是任何持有名为“元素”(相同types)的数据的东西。 没有更具体的假设。
-
列表是每个元素都有一个索引的索引数据集合。 像数组,但更灵活。
列表中的数据保持插入的顺序。
-
Set是一包元素 ,每个元素只有一次(元素用
equals()
方法来区分。数据集中的数据主要是为了知道哪些数据在那里存储的。
-
映射类似于List,但不是通过整数索引访问元素,而是通过它们的键 (任何对象)来访问它们。 像PHP中的数组:)
地图中的数据可以通过密钥进行search。
Set和Map之间的主要区别在于设置你自己 search数据,而在地图上则是按键 。
这很简单:如果你需要存储键值映射到他们的值去Map接口,否则使用列表的值可能会重复,最后使用设置界面,如果你不想在你的集合重复的值。
这里是完整的解释http://javatutorial.net/choose-the-right-java-collection ,包括stream程图等