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 。

浙公网安备 33010602011771号