集合框架图

  • Iterator
    Java 集合类的父接口,提供了hasNext() next() remove()等方法遍历集合。Map接口没有实现该接口。
  • Collection
    Collection接口实现了Iterator接口,大部分的集合类都实现了Collection接口。Collection下面有两个重要的接口,分别是ListSet
  • Map
    Map接口下的实现类都是以键值对的方式进行存储,如HashMapTreeSet等。

List

  • ArrayList线程不安全。内部使用一个Object[]数组进行存储,数组初始容量为10,当数组大小不足时容量扩大1.5倍。
  • LinkedList线程不安全。使用双向链表实现。它还可以当做队列或栈使用。关于栈或队列,现在的首选是ArrayDeque,它有着比LinkedList(当作栈或队列使用时)有着更好的性能。

如果需要线程安全,可以使用Vector(内部使用synchronized同步锁,现在已经不推荐使用)、Collections.synchronizedList()CopyOnWriteArrayList(适合读多写少)。

Set(不包含重复元素)

  • HashSet线程不安全。内部使用HashMap的键进行存储。元素可以为null
  • LinkedHashSet线程不安全。保持插入顺序。
  • TreeSet线程不安全。可以排序。

如果需要线程安全,可以使用Collections.synchronizedSet()CopyOnWriteArraySet(适合读多写少)。

Map

  • HashMap线程不安全。根据keyhashCode计算出HashMap内数组的下标,然后把value存在这个数组(数组默认大小为16)里,如果数组内有多个元素,则使用链表的方式存储,如果链表长度超过8个,链表会转换成红黑树。
  • LinkedHashMap线程不安全。保持插入顺序。
  • TreeSet线程不安全。基于红黑树。可以排序。
  • Hashtable线程安全。线程安全使用synchronized关键字实现,keyvaluenull时抛空指针异常。
  • ConcurrentHashMap线程安全。性能比Hashtable好,因为内部锁的控制粒度更小。

如果需要线程安装,可以使用HashtableCollections.synchronizedMap()ConcurrentHashMap

参考

  • https://frank-lam.github.io/fullstack-tutorial/#/JavaArchitecture/02-Java集合框架