java面试中一些常见的集合类汇总总结
一、集合
1、list集合
list集合主要包括:
ArrayList, CopyOnWriteArrayList, LinkedList, Stack, Vector
重点讲一下CopyOnWriteArrayList
1.1、CopyOnWriteArrayList
类说明:线程安全,适用于写少读多的缓存场景,添加元素时,将整个集合复制一份,将对象改变后,将原先集合的引用指向修改后的集合,整个写入操作是加锁的。
内存占用问题。因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象,需要控制对象大小,防止频繁的Yong GC和Full GC。
add方法代码:
2、Set集合
set集合主要包括:
CopyOnWriteArraySet 同CopyOnWriteArrayList特性一致
HashSet 不允许重复元素,无序,线程不安全
LinkedHashSet 无序,允许重复元素,线程不安全
TreeSet 有序,不允许重复元素,线程不安全
3、map集合
map集合主要包括:
- 采用分段加锁机制保证多线程环境下集合的安全性,整个map分成多个segment,segment的个数决定了能同时并发修改的线程个数,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。
- 底层数组+链表实现,可以存储null键和null值,线程不安全
- 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂
- 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入
- 当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀
- java8后为提高时间效率,在发生hash碰撞后形成链表,如果链表长度超过一定长度(一般是8)之后会形成红黑树的数据结构提高查询效率。
HashMap的Entry的一些属性:
K key
V value
Entry<K, V> next
int hash
- 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化
- LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator遍历LinkedHashMap 时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
- 通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序。
LinkedHashMap的Entry的一些属性:
K key
V value
Entry<K, V> next
int hash
Entry<K, V> before
Entry<K, V> after
有序的map集合,是一个有序的map集合。
TreeMap的一些属性:
K key; //键
V value; //值
Entry<K,V> left = null; //左孩子节点
Entry<K,V> right = null; //右孩子节点
Entry<K,V> parent; //父节点
boolean color = BLACK; //节点的颜色,在红黑树种,只有两种颜色,红色和黑色
WeakHashMap 与HashMap的区别,很简单。就是WeakHashMap的Key的对象,如果除了自身有对key的引用外(意思就是没有其它外部引用 ),那么,这个Key和Value,就会被自动删除掉,而HashMap的则不会。