java面试中一些常见的集合类汇总总结

一、集合

1、list集合

list集合主要包括:

ArrayList,  CopyOnWriteArrayList, LinkedList, Stack, Vector

重点讲一下CopyOnWriteArrayList

1.1、CopyOnWriteArrayList

类说明:线程安全,适用于写少读多的缓存场景,添加元素时,将整个集合复制一份,将对象改变后,将原先集合的引用指向修改后的集合,整个写入操作是加锁的。

内存占用问题。因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象,需要控制对象大小,防止频繁的Yong GC和Full GC。

add方法代码:

java面试中一些常见的集合类汇总总结

2、Set集合

set集合主要包括:

CopyOnWriteArraySet 同CopyOnWriteArrayList特性一致

HashSet 不允许重复元素,无序,线程不安全

LinkedHashSet 无序,允许重复元素,线程不安全

TreeSet  有序,不允许重复元素,线程不安全

3、map集合

map集合主要包括:

ConcurrentHashMap

  • 采用分段加锁机制保证多线程环境下集合的安全性,整个map分成多个segment,segment的个数决定了能同时并发修改的线程个数,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。

HashMap

  • 底层数组+链表实现,可以存储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

Hashtable

  • 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化

LinkedHashMap,

  • 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

TreeMap

有序的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

WeakHashMap 与HashMap的区别,很简单。就是WeakHashMap的Key的对象,如果除了自身有对key的引用外(意思就是没有其它外部引用 ),那么,这个Key和Value,就会被自动删除掉,而HashMap的则不会。