by shihang.mai
1. 集合框架核心类图
2. List
特别提醒方法subList(),通过原list,返回一个子list.
- 对于非结构性的改变,都会影响彼此影响
- 对于结构性改变
- 改变的是子list,不会触发fast-fail(因为modCount与expectedModCount同时改变)
- 改变的是原list,触发fast-fail
2.1 ArrayList
ArrayList 是一个动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低;
- 它实现了 RandomAccess接口,快速随机访问
在遍历List之前,可以用 if( list instanceof RamdomAccess ) 来判断一下。因为对于实现了RandomAccess接口,直接for循环比迭代器快 - 它是非线程安全的,在多线程下,可以使用Collections.synchronizedList(List l)返回一个安全的list或者用
CopyOnWriteArrayList
- 初始容量为10(在加入元素时,才初始化),扩容为1.5倍
2.2 LinkedList
LinkedList 是一个双向链表。LinkedList 随机访问效率低,但随机插入、随机删除效率高。
LinkedList可作为Stack(栈)、Queue(队列)或Deque(双端队列:double-ended queue)进行使用
2.3 其他
Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但ArrayList是非线程安全的,而Vector是线程安全的,所有方法加上synchronized关键字
Stack先进后出
2.4 区别
- ArrayList和LinkedList区别
- 非线程安全
- ArrayList是Object数组,LinkedList是双向链表(1.6之前是循环链表,1.7取消了循环),意义:
在两头,对于循环链表来说,由于首尾相连,还是需要处理两头的指针。而非循环链表只需要处理一边first.previous/last.next,所以理论上非循环链表更高效。恰恰在两头(链头/链尾) 操作是最普遍的
- ArrayList用于数据的随机访问,LinkedList用于数据的增加删除修改
- ArrayList和Vector区别
- Vector线程安全的;ArrayList非线程安全
- 都是Object数组,但是扩容机制不同
- 多线程访问安全数组,一般使用CopyOnWriteArrayList
3. Set
4. queue
5. Map
详情查看hashmap文章