Collection架构层次关系
1.Set (不能有重复元素)
1.1HashSet
1.1.1LinkedHashSet
2.List (必须保持元素特定的顺序)
2.1ArrayList
2.2Vector
2.2.1Stack
2.3LinkedList
3.Queue (保持一个队列(先进先出)的顺序)
3.1PriorityQueue
3.2Deque(接口
3.2.1 ArrayDeque
3.2.2 LinkedList
1.1HashSet
关系:
java.util.HashSet ,继承AbstractSet<E> ,实现Set<E>
原理:
HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。 注意:
HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等
1.1.1 LinkedHashSet
关系:
java.util.LinkedHashSet, 继承HashSet<E>,实现Set<E>
原理:
LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置。
但和HashSet不同的是,它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。
注意:
当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。 LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时(遍历)将有很好的性能(链表很适合进行遍历)
2.1 ArrayList
关系:
java.util.ArrayList,继承AbstractList<E>,实现List<E>
原理:
可以动态增长的数组;默认数组的容量为10
特点:
- 随机访问速度快,插入和移除性能较差(数组的特点);
- 支持null元素;
- 有顺序;
- 元素可以重复;
- 线程不安全;
- ArrayList 扩容1.5倍
时间复杂度:
- get() 直接读取第几个下标,复杂度 O(1)
- add(E) 添加元素,直接在后面添加,复杂度O(1)
- add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n)
- remove()删除元素,后面的元素需要逐个移动,复杂度O(n)
2.2 Vector
关系:
java.util.Vector; 继承AbstractList<E>, 实现List<E>
原理:
- 底层由一个可以增长的数组组成
特点:
- 同步类,每个方法前都有同步锁 synchronized
- 线程安全
- 效率比ArrayList低
2.2.1 Stack
关系:
java.util.Stack;继承Vector<E>
原理:
- 基于Vector实现,线程安全
特点:
- 先进后出
2.3 LinkedList
关系:
java.util.LinkedList; 继承AbstractSequentialList,实现List<E>, Deque<E>
原理:
基于链表实现的List;同时它还实现Deque接口,即能将LinkedList当作双端队列使用。也可以到对栈来使用
时间复杂度:
- get() 获取第几个元素,依次遍历,复杂度O(n)
- add(E) 添加到末尾,复杂度O(1)
- add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n)
- remove()删除元素,直接指针指向操作,复杂度O(1)
3.1 PriorityQueue
关系:
java.util.PriorityQueue; 继承AbstractQueue<E>;
原理:
PriorityQueue的逻辑结构是一棵完全二叉树,存储结构其实是一个数组。
特点:
PriorityQueue并不是一个比较标准的队列实现,PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序
3.2 Deque(接口)
关系:
java.util.Deque; 继承Queue<E>
特点:
Deque接口代表一个"双端队列",双端队列可以同时从两端来添加、删除元素,因此Deque的实现类既可以当成队列使用、也可以当成栈使用
3.2.1 ArrayDeque
关系:
java.util.ArrayDeque;继承AbstractCollection;实现Deque<E>
原理:
基于数组实现
特点:
- 默认容量为16
3.2.2 LinkedList
关系:
java.util.LinkedList; 继承AbstractSequentialList,实现List<E>, Deque<E>