Java企业教程系列

Java集合Collection使用概述

  本文是从性能角度对Java所有集合进行一个实战方面的比较与总结,并且列出在不同集合之间转换的正确方式。

List

  在单线程下的List有:

  • ArrayList是基于数组;
  • LinkedList最好不用使用;
  • Vector已经被废弃。

  在多线程情况下:

  • 使用CopyOnWriteArrayList ,适合很少更新,经常来回遍历。

 

Queue/deque

  在单线程下队列可以使用:

  • 通常是ArrayDeque基于数组的;
  • Stack被废弃了;
  • PriorityQueue 适合排序的检索操作;

  在多线程情况下:

  • ArrayBlockingQueue是有界的堵塞队列;基于数组实现的堵塞队列,大小不能变化,当你试图加入新元素到满的队列中时,该方法将堵塞直至其他线程从该队列释放元素。
  • ConcurrentLinkedDeque / ConcurrentLinkedQueue是无界的linked queue(使用CAS并发);一个元素加入队列不会堵塞,但是队列的消费者比较工作得和生产者一样快,否则就会out of memory,严重依赖CAS(compare-and-set);
  • DelayQueue 是每个元素有延迟的队列;一个元素只有超过延时时间后才会从队列中取出,这对于实现需要延时任务队列时有效。结合ScheduledThreadPoolExecutor 使用。
  • LinkedBlockingDeque / LinkedBlockingQueue - 可选的有界的linked queue (使用lock实现并发),基于linkedlist实现,使用ReentrantLock实现空/满的条件判断。
  • LinkedTransferQueue - 基于linkedlist的无界队列,有一组transfer方法,允许生产者直接发送消息给界首镇,这样去除了将元素保存进队列的必要性,这是一个基于CA的无锁集合。
  • PriorityBlockingQueue - 并发的PriorityQueue
  • SynchronousQueue - 没有内部容量的堵塞队列,意味着任何插入请求必须等待从队列中移除后才可以插入。

 

Map

  单线程:

  • HashMap - 通用的
  • EnumMap - enum keys
  • Hashtable - 废弃
  • IdentityHashMap - 对key使用==比较
  • LinkedHashMap - 保持插入顺序
  • TreeMap - 对key进行排序
  • WeakHashMap - 对缓存有用

  多线程:

  • ConcurrentHashMap - 通用的并发map
  • ConcurrentSkipListMap - 排序的并发map

 

Set

  单线程:

  • HashSet - 通用set
  • EnumSet - 枚举集合
  • BitSet - 位整数
  • LinkedHashSet - 保持插入顺序
  • TreeSet - 排序的set

  多线程:

  • ConcurrentSkipListSet - 排序的并发set
  • CopyOnWriteArraySet - 很少更新,经常来回遍历

 

Java Collection集合面试题

Java性能优化技巧