集合框架
Collection
list: 有序可重复集合
ArrayList:1、排列有序,可重复 2、底层使用数组 3、查询快可以根据下标直接定位,增删慢删除完需要移位,集合长度变化。4、线程不安全 5、集合满时默认扩充为原来的1.5倍
Vector:1、有序可重复 2、底层使用数组 3、查询快、增删慢(同上) 4、线程安全( 方法被Sychronized修饰,并发性差)的古老类1.0就存在的 5、集合满时扩充为原来的2倍
LinkedList: 1、有序可重复 2、底层使用双向链表 3、查询速度慢(底层不是数组不能通过下标直接定位,需要顺着链表找)、增删速度快(链表结构,增删直接打断链表然后把新数据加进去,再连上就行) 线程不安全
set: 无序不可重复集合
HashSet: 1、排列无序,不可重复 2、底层使用hash表实现(hash算法桶位) 3、存取速度快 4、内部是HashMap,键值存储set集合的值,value存储static final Object
TreeSet: 1、排列无序,不可重复 ,存储的是TreeMap,键值存储set集合的值,value存储static final Object
2、底层使用平衡二叉树 :
(1)若它的左子树不空,左子节点小于根节点
(2)若它的右子树不空,右子节点大于根节点
(3)它的左右子树也分别称为二叉排序树
LinkedHashSet: 采用hash表存储,并用双向链表记录插入顺序。有序不可重复
**Map:**键值不能重复,值可以重复。存储键值对
HashMap: 1、键值不能重复,值可重复 2、底层使用hash表 3、线程不安全
4、允许一个Key值为null,多个value值也可以为null 5、加载默认0.75
6、java7使用链表+数组,查询时根据hashcode确定位置,之后按照链表往下找,时间复杂度为O(n),Java8使用链表+红黑树+数组,当链表超过8个时变为红黑树。查询时降低了时间复杂度logO(n)
1.7在多线程环境下,扩容时会造成环形链或数据丢失。
1.8在多线程环境下,会发生数据覆盖的情况。
**HashTable:**1、键值不能重复、值可重复 2、底层为hash表 3、线程安全 方法被Synchronized修饰,并发性差
4、key、value值都不允许为null
TreeMap: 1、键不能重复,值可以重复 2、底层为二叉树 3、遍历时得到的数据是按键值排过序的
**ConcurrentHashMap:**1、1.7由一个个Segment组成,Segment继承了ReentrantLock进行加锁,因此每个Segment是线程安全的,从而保证ConcurrentHashMap整体是线程安全的。 ConcurrentHashMap默认由16个Segements,理论上可以支持16个线程并发写操作。Java8引入了红黑树,1.8CAS+Synchronized
红黑树的特点:
(1)每个节点或者是黑色,或者是红色
(2)根节点是黑色
(3)每个叶子节点是黑色
(4)如果一个节点是红色的,则它的子节点必须为黑色
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
LinkedHashMap:是 HashMap 的一个子类,保存了记录的插入顺序