1. Collection接口下的类图
接口:
1. Iterabel mplementing this interface allows an object to be the targetof the "for-each loop" statement
2. Collection 定义了一些通用的集合方法,也实现了一些jdk8才有的东西Stream ,Spliterator
3. List List接口 实现了spliterator方法以及定义了满足Lis属性的方法
4. Queue 有确定进出规则属性的列表
5. Set 不能是重复数据的集合接口
6. Deque 继承Queue接口的定义并增加自己的方法定义 的 双端队列
类:
1. AbstractCollection 实现了Collection接口里的基本方法
2. AbstractList 实现了List接口里基本的方法
3. AbstractSequentialList 顺序的AbstractList的抽象类
4. Vertor 线程安全的实现List接口的类
1. 底层使用数组实现,若使用不带参数的构造方法,则生成长度为10的Object类型数组, 若个数超过10,则生成一个新数组,如果capacityIncrement>0,就加capacityIncrement,如果不是就增加一倍,原数组的内容复制到新数组中
2.线程安全 很多方法都是synchronized 修饰的
5. ArrayDeque 实现双端队列接口的可变大小数组
1. 底层使用数组实现,若使用不带参数的构造方法,则生成长度为16的Object类型数组, 若个数超过16,则生成一个个数是原来一倍新数组,原数组的内容复制到新数组中
2. 非线程安全
3. 禁止填入为null的元素
6. AbstractQueue 实现Queue接口的基础抽象类
7. AbstractSet 实现Set接口的基础抽象类
8. PriorityQueue 优先队列,有自己排序方案的队列
1. 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator,类似于C++的仿函数)
2.不允许放入null元素
3. 使用数组实现,内部算法是完全二叉树(complete binary tree)实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值)
4. 元素之前的关系leftNo = parentNo*2+1; rightNo = parentNo*2+2; parentNo =(nodeNo-1)/2;
5. peek()和element 常数复杂度 add(), offer(),无参的remove()和poll的时间复杂度为log(N)
6. 默认元素是11个,queue 的长度小于 64 时,它每次扩容都是比原来大一倍且再多扩充两个存储单位;而当queue 的长度大于等于64 之后,它每次扩容都是比原来多扩50%的空间
9. EnumSet 继承AbstractSet且元素都是枚举类型
1. 内部元素为枚举
2. 内部表示为位向量,使用“位标志”的替换形式。(类似0x1000000,按bit存储,用位运算进行相关操作)
3. 全部是静态方法static
4. 根据传入的枚举类型判断组成长度,小于等于64则返回RegularEnumSet,否则JumboEnumSet
10. HashSet 内部是HashMap的Set集合
11. TreeSet 内部是NavigableMap的Set集合
12. LinkedList 双端List即实现了List接口又实现了Deque接口
1. 底层是Node对象构成的双向链表实现,因此没有固定容量,不需要扩容
- 元素时有序的,输出顺序与输入顺序一致
- 允许元素为 null, 不是同步容器
- 所有指定位置的操作都是从头开始遍历进行的
5. 需要更多的内存,LinkedList 每个节点中需要多存储前后节点的信息,占用空间更多些
6. 查找效率低,插入删除效率高
13. ArrayList 允许为空的可变数组.
1. 底层采用数组实现,若使用不带参数的构造方法,则生成长度为10的Object类型数组, 若个数超过10,则生成一个新数组,长度为原数组的1.5倍+1,原数组的内容复制到新数组中
2. 删除时,后续前移,代价高,获取指定位置元素的时间复杂度为O(1)
3. 加入元素是加入到数组的最后位置,加到固定位置和加入新集合是直接使用数组复制功能
14. Stack 后进先出的栈
1. 继承自Vector类,拥有Vector的所有特性
2. 且还有自己实现的后进先出的方法
15. LinkedHashSet Hash table andlinked list implementation of the Set interface且有序
2. Map下的类图
接口:
- Map K,V 样式的数据集合K是Set<K>
- ConcurrentMap 线程安全的Map接口
- SortedMap 对Key进行排序的Map接口
- NavigableMap 对有序的key进行大于 小于的判断操作的Map接口
- ConcurrentNavigableMap 线程安全的NavigableMap接口
类:
1. AbstractMap Map接口基本方法的实现
2. Hashtable 线程安全的Map实现 大部分函数被synchronized修饰
1. 底层实现是一个Entry数组+链表且key和val都不能为null
2. Hashtable中数组默认大小11,扩容方式是old*2+1
3. ConcurrentHashMap 线程安全但非Hashtable实现方式的Map实现
1. 它摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法。它沿用了与它同时期的HashMap版本的思想,底层依然由“数组”+链表+红黑树的方式思想,但是为了做到并发,又增加了很多辅助的类,例如TreeBin,Traverser等对象内部类
4. IdentityHashMap 别样的识别Key的Map实现接口
1. HashMap是key的值相同那就是同一个key不管key的引用的,IdentityHashMap是要看引用的,引用都相同那才是一个key
2.数据是存放在transient Object[] table中的
3.Hash函数会一直是偶数,用来存key,所有的value都放在奇数位置上
5. TreeMap 以红黑树为底层的NavigableMap接口的实现
1.按照键的自然顺序排序或者自己定义的Comparator进行排序
6. EnumMap Key是枚举类型的Map接口
7. ConcurrentSkipListMap 线程安全的Map接口
8. WeakHashMap weak keys的以Hashtable为基础实现的Map类
9. LinkedHashMap Hashtable和LinkList实现的Map类
10. HashMap 基础的Map实现类,非线程安全
1.底层结构为数组+链表+红黑树
2.初始数据个数为16,超过后数据量*2