[Magic Collection & Map] Java、Android集合类概况、继承关系
本文主要使用UML图,介绍Java和Android涉及到的容器类之间的关系,作为一个索引,来进行接下来的一些集合源码的阅读。
[TOC]
[Magic Collection & Map] Java、Android集合类概况、继承关系
容器的具体关系主要可以分为:
- Collection
- List:
- Set:不可重复的一组数据
- Queue、Deque:可以进行队列操作的数据
- Map:键值对
- 并发类汇总:
- Blocking、Concurrent、CopyOnWrite
选择集合的考虑
List
- 数组实现:随机访问时性能最好
- 链表实现:在执行插入、删除操作时有很好的性能
- 栈和队列:queue可以作为队列,Deque可以作为队列和栈,在只需要队列的情况下应使用queue来限制操作
Set
- 存储不重复的数据时使用Set
- 对于普通的插入、删除操作,LinkedHashSet比HashSet要略慢一点,遍历会快
- EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素
Map
- 使用HashMap而不是HashTable,HashTable需要同步消耗
- 需要排序再使用TreeMap,构建红黑树的方式进行排序
Collection、Iterator
Iterator,可以使用foreach
进行遍历,还有迭代器iterator()
方法进行遍历
Collection就是一个组数据的集合
打不开点击这个链接打开大图 http://i2.buimg.com/567571/d01721b1ed7c847c.png
List
作为一个线性表接口,可重复,因此可以通过索引
来指定位置的集合元素
ArrayList、LinkedList
- ArrayList基于数组封装,默认大小是12,每次扩容至原来的1.5倍
- LinkedList继承自AbstractSequentialList,使用链表实现,实现了Queue和Deque,可以用作队列和栈
Vector、Stack
- Vector与ArrayList几乎一样,古老的版本,支持线程安全
- Starck是Vector 的子类,栈的结构(后进先出)
Set
实现Collection,不能有重复的数据,使用equals来判断是否相同,使用Map来实现
HashSet、LinkedHashSet、EnumSet
- 使用Hash来决定存储位置,使用equals+HashCode来判断两个对象是否相同
- 继承自HashSet,使用链表实现,需要维护元素插入位置,适合遍历;实现了Deque接口,可以作为栈队列来进行使用
- EnumSet提供给枚举类使用
SortedSet——TreeSet
- TreeSet是SortedSet的实现,保证元素有序
Queue
ArrayQueue、PriorityQueue
数组实现的队列和优先级队列
Deque——ArrayDeque
数组实现的双端队列,可以用作队列和栈
Map
保存键值对数据(key-value)
HashMap、HashTable、LinkedHashMap
- HashMap用key 的hashCode 值进行hash定位,用equals+hashCode方法判断两个key 相等
- HashTable继承自Dictionary,并实现Map接口,线程安全,古老类
- LinkedHashMap继承自HashMap,按照插入顺序排序,使用双向链表
SortedMap——TreeMap
是一个红黑树结构,会进行排序
WeakHashMap、IdentityHashMap、EnumMap
- WeakHashMap”弱引用”,可能会被垃圾回收
- IdentityHashMap使用“==”来进行判断key是否相等
- EnumMap枚举类实现的Map
并发类相关
List相关:
Set相关:
Map相关:
Concurrent
- ConcurrentHashMap
- ConcurrentSkipListMap
- ConcurrentSkipListSet
- ConcurrentLinkedQueue
CopyOnWrite
- CopyOnWriteArrayList
- CopyOnWriteArraySet
Blocking
- LinkedBlockingDeque
- LinkedBlockingQueue
- ArrayBlockingQueue
- PriorityBlockingQueue