集合:
ArrayList
特点
有序插入,不安全,可以为空,可以重复
扩容机制,
创建实例的时候会赋予elementData一个空的数组,进行第一次add的时候会将长度赋值为10,如果超出数组长度就进行扩容,扩容方法为使用右移位扩容至源数组的1.5倍,
add()添加元素
底层是动态数组进行add的时候会首先调用一个方法,方法内部存在大量的方法调用,进行判断要插入的下标是不是大于等于当前数组的长度,如果大于或者等于那么就调用grow方法进行数组的扩容,就是将新数组的长度增加为当前数组长度加上当前数组长度的1.5倍(使用的是位移运算 >> 1 相当于除2 << 1 相当于乘2) ,
remove()删除元素
会判断当前元素是否为最后一个元素 如果是将最后一个元素赋值为null;如果不是就使用Arrays.copy命令将这个元素后的所有元素都向前移位
LinkendList:
特点
有序插入,允许重复,可以为null,不安全
底层原理
双向链表使用node是进行存储,包含上一个节点位置,下一个节点的位置和item(自己的值)
扩容机制
初始化为0,随着元素的增加增加
vector
父类
AbstractList
实现list
特点
值可以重复,可以为空,线程安全,使用synchronized锁实现(同步方法)
底层原理:
动态数组,
扩容机制:
初始化容量为10,
最容量Integer.max-8
如果有设置容量就扩容旧数组+容量,没有的话就扩大两倍
HashSet(为什么不使用hashmap???)
父类
AbstractSet
实现 Set
特点
无序存入,可以为null ,不安全,可重复
底层原理
new 了一个hashMap…
扩容机制
全部调用hashmap的方法
TreenSet
父类
AbstractSet
实现 NavigableMap
特点:
不许为null(将值作为key进行存储),不能重复,插入无序天然排序,不安全
底层原理
new 了一个TreenMap…给NavigableMap进行赋值全称调用NavigableMap的方法
hashMap
父类:
AbstractMap
特点
无序,key允许一个null,value允许多个null,不安全,可重复
将元素以Node的方式进行存储,其中包含key的hash,key,val,和下一个Node节点的位置
底层原理
动态数组+链表+红黑树的方式
扩容机制:
刚创建时为0,进行第一次put长度变为16;当存储的元素达到数组长度的0.75倍时扩容至源数组的2倍,如果链表的长度达到8时就会通过算法将链表转为红黑树,红黑树节点为6时就通过算法将其转为链表的形式
达到负载因子后就会重写hash,重新计算hash值的位置,比较浪费性能.
put()存值
当进行put时会先判断是否为第一次进行存值,如果是将数组的长度就扩容为16,首先在进行判断key值是否为null,为null就存放在tab0的位置,不为null,存储时使用数组长度-1跟可以的hash值进行与运算操作的到一个一定小于数组下标的索引值进行存储,如果该位置有元素存在着进行key值的equals判断,相等就替换不相等就以链式方式进行存储,如果链表的长度为8就转为红黑树,如果不为8就进行追加,
remove()删除值
在进行删除时,首先判断是否为null,为空就删除table[0],不为空就进行key值的与运算,找到对应的索引,然后进行查看是否有链表存在,不存在直接删除,存在就循环判断key值是否相等,找到相等的进行删除.
HashTable
特点
不能为空,无序存放,线程安全synchronized锁实现(同步方法) value可以重复
底层原理
跟hashMap相同,以Entry的方式进行存储包含key的hash key value 以及下一个节点
扩容机制:
初始容量为11,负载因子为0.75,使用左位移运算,进行二倍+1的扩容
达到负载因子后就会重写hash,重新计算hash值的位置,比较浪费性能.
put()添加
1.7的hash 先判断是否为null为null就抛出null
TreeMap
父类
AbstractMap
特点
key不能为null,天然排序,key不可重复,不安全的
底层原理
平衡二叉查找树
扩容机制
随元素的增加而增加
ConcurrentHashMap
父类:
AbstractMap
实现:ConcurrentMap
特点
key和value都不能为空,线程安全的(同步代码块的方式+cas算法) 无序的
底层原理
分段数组
扩容机制
到达分段数组的长度就进行新建数组
LinkedHashMap
父类
HashMap
接口:Map
构建时调用父类构造器,创建HashMap,存储时调用父类的put…
特点
允许key和value为空,线程不安全,存储有序取值有序,value可以重复
底层原理:
动态数组+链表+红黑树,增加一个双向链表保证遍历顺序和插入顺序一致,
如有错误请见谅,联系作者进行更改,互相学习