JAVA中集合比较

一,java中各种集合的关系图 

Collection               接口的接口           对象的集合 
├ List                    子接口                 按进入先后有序保存     可重复 
│├ LinkedList         接口实现类           链表                         插入删除       没有同步         线程不安全 
│├ ArrayList           接口实现类           数组                         随机访问       没有同步         线程不安全 
│└ Vector              接口实现类           数组                                            同步               线程安全 
│   └ Stack 
└ Set                    子接口                仅接收一次,并做内部排序 

├ HashSet 

│   └ LinkedHashSet 
└ TreeSet 

 

List :

关心的是顺序,它保证维护元素特定的顺序允许有相同元素),

使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在 List 中的位置,类似于数组下标的指针)来访问 List 中的元素。 

 

 

Map                            接口                         键值对的集合 
├ Hashtable                 接口实现类                同步                        线程安全 
├ HashMap                  接口实现类                没有同步                  线程不安全 

│├ LinkedHashMap 

│└ WeakHashMap 

├ TreeMap 
└ IdentifyHashMap 

 

Map:

最大的特点是键值映射,且为一一映射,键不能重复,值可以,所以是用键来索引值。 

Map 也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用 LinkedHashSet 或者 LinkedHashMap

 

使 LinkedList 可被用作堆栈( stack ),队列( queue )或双向队列( deque )。 

构造一个同步的 List : 
     List list = Collections.synchronizedList(new LinkedList(...)); 

 

ArrayList :数组实现的 List;允许对元素进行快速随机访问,但是向 List 中间插入与移除元素的速度很慢

Vector :非常类似 ArrayList ,但是 Vector 是同步的。

Stack : Stack 继承自 Vector ,实现一个后进先出的堆栈。 

 

Set :

一种不包含重复的元素的 Collection 

HashSet 类:
为快速查找设计的 Set 。存入 HashSet 的对象必须定义 hashCode()

LinkedHashSet :

具有 HashSet 的查询速度,且内部使用链表维护元素的顺序 ( 插入的次序 ) 。于是在使用迭代器遍历 Set 时,结果会按元素插入的次序显示。 

TreeSet 类:
保存次序的 Set, 底层为树结构。使用它可以从 Set 中提取有序的序列。

 

标准的 Java 类库中包含了几种不同的 Map : HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap 。

 

HashMap 类:
HashMap 和 Hashtable 类似,也是基于散列表的实现。不同之处在于 HashMap 是非同步的,并且允许 null ,即 null value 和 null key 。

LinkedHashMap :

类似于 HashMap ,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用 (LRU) 的次序。只比 HashMap 慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。 

WeakHashMap :

弱键( weak key ) Map 是一种改进的 HashMap ,它是为解决特殊问题设计的,对 key 实行 “ 弱引用 ” ,如果一个 key 不再被外部所引用(没有 map 之外的引用),那么该 key 可以被垃圾收集器 (GC) 回收。 

TreeMap :
基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序 ( 次序由 Comparabel 或 Comparator 决定 ) 。 TreeMap 的特点在于,你得到的结果是经过排序的。 TreeMap 是唯一的带有 subMap() 方法的 Map ,它可以返回一个子树。 

IdentifyHashMap 类:
使用 == 代替 equals() 对“键”作比较的 hash map 。专为解决特殊问题而设计。 

 

如何选择 

从效率角度: 

在各种 Lists ,对于需要快速插入,删除元素,应该使用 LinkedList (可用 LinkedList 构造堆栈 stack 、队列 queue ),

                    如果需要快速随机访问元素,应该使用 ArrayList 。最好的做法是以 ArrayList 作为缺省选择。 Vector 总是比 ArrayList 慢,所以要尽量避免使用。 

在各种 Sets 中, HashSet 通常优于 HashTree (插入、查找)。只有当需要产生一个经过排序的序列,才用 TreeSet 。 HashTree 存在的唯一理由:能够维护其内元素的排序状态。 

在各种 Maps 中, HashMap 用于快速查找。 

最后,当元素个数固定,用 Array ,因为 Array 效率是最高的。 
所以结论:最常用的是 ArrayList , HashSet , HashMap , Array 。 

posted @ 2016-09-29 09:54  malcome  阅读(143)  评论(0)    收藏  举报