Java 集合
Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
- Collection:代表一组对象,每一个对象都是它的子元素。
- Set:不包含重复元素的Collection。
- List:有顺序的collection,并且可以包含重复元素。
- Map:可以把键(key)映射到值(value)的对象,键不能重复。
ArrayList
底层基于数组 增加超过容量会扩容(数组复制
Arrays.copyOf) 减少也会复制数组
线程不安全:添加元素时,
1. 在 Items[Size] 的位置存放此元素;
2. 增大 Size 的值。
不是原子操作
LinkedList
基于双向链表 查找会遍历(二分查找)
线程安全的集合可以用
包装起来
CopyOnWriteArrayList
使用了一种叫
写时复制
的方法,当有新元素添加到
CopyOnWriteArrayList
时,先从原有的数组中拷贝一份出来,然后在新的数组做写操作,写完之后,再将原来的数组引用指向到新数组。
合适
读多写少
的场景,
HashMap
数组+链表 (1.8以上链表长度大于8会升级成红黑树 查找快)
扩容: 会重新计算hash(1.7)
看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引 +oldCap”(1.8)
线程不安全 : 1,put的时候 头插入 链表指向
2,扩容的时候,新数组的指向
3,扩容的时候,死链
数组长度一定是2的次幂:为了分布均匀
ConcurrentHashMap
JDK1.7版本的ReentrantLock+Segment+HashEntry,到JDK1.8版本中synchronized+CAS+HashEntry+红黑树,
HashSet
有一个HashMap属性(适配器模式)
每个属性是HashMap的key。value是一个new Object()
TreeSet
有一个
TreeMap
属性(适配器模式)
TreeMap
底层通过红黑树(Red-Black tree)实现
LinkedHashMap
LinkedHashMap是HashMap的一个子类,它保留插入的顺序,底层使用哈希表与双向链表来保存所有元素
应用:LRUCache(近期最少使用) 通过LinkedHashMap 访问顺序
LinkedHashSet
有一个LinkedHashMap
(适配器模式)