Set
HashSet
- 内部是通过hashmap来实现的
- add(E e) 添加的元素是key ,value是一个空对象
-
TreeSet
内部通过TreeMap实现
-
List
Vector
线程安全
- 和Arraylist一样,加了同步
ArrayList
- 底层是数组,默认大小为10
- 扩容逻辑: 原大小+(原大小*1/2)
- add(index,e) 将源数据拷贝到index+1位置 element[index] = e
-
LinkedList
双向链表
- 查找逻辑:如果index <size/2 则从前面找 大于这从后面找
- 线程不安全
-
CopyArrayList
读写分离。写会复制一份进行操作,然后再替换掉
- 优点
- 读写分离,线程安全
缺点
实现原理
- 数组+链表,小于8个value时候,put计算hash值存放在hash表中,如果出现hash冲突,则通过链表方式将冲突的值放在末尾
- 红黑树,搜索时间为O(logn) 大于8个value的时候
- resize
- 给数组扩容,扩容为旧表的2倍
- 当++size>阈值的时候进行扩容
- 扩容后遍历整个结构,把所有的元素重新hash 添加到新表中
- 两个hashcode 相等通过key.equls获取对应的value
-
LinkedHashMap
实现原理
1.8实现原理
- 整体的实现与hashmap类似,加入了CAS+Synchoronized 保证并发安全性
- put实现
- 根据key计算出hashcode
- 判断是否需要初始化
- 通过key定位出node 如果node== null 则可以写入数据,利用CAS尝试写入,如果失败则自旋保证成功
- 如果hashcode ==-1 则需要扩容
- 如果以上都不满足,则利用synchroized 锁住node写入数据
- 如果size>8 则转为红黑树
- get 处理流程与HashMap一致