2018-7-23-Java集合框架

Collection

首先理解一下集合框架的整体设计,下图并没有包括与并发相关的集合,也没有map。

image

从上图可以看出Java集合是以Collection为接口,然后下面分为三大类:

  • List:提供最基本的集合操作,元素可以重复
  • Set:提供最基本的集合操作,元素不可以重复(不存在两个对象 equals 返回 true)
  • Queue:实现队列操作,先进后出

List 细分为三种:

  • ArrayList:使用数组实现,访问操作快(通过数组下标直接访问),修改操作慢(需要将部分数组整体后移);默认容量10,每次扩容50%。 ArrayList支持序列化。
  • LinkedList:使用链表实现,访问操作慢(需要遍历),修改操作快(改变链表的指向)。
  • Vector:使用数组实现的线程安全的list。默认容量10,每次扩容增加一倍(在不指定增加容量系数的情况下)。Vector不支持序列化。

fail-fast

fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。 例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出java.util.ConcurrentModificationException异常,产生fail-fast事件。

ArrayList中进行迭代是会执行 checkForComodification()。若 ==“modCount != expectedModCount”==,则抛出ConcurrentModificationException异常,产生fail-fast事件。

CopyOnWriteArrayList中的add、set、remove等会改变原数组的方法中,都是==先copy一份原来的array==,再在copy数组上进行add、set、remove`操作,这就不影响COWIterator那份数组(迭代的数组)。

Map

map是以键值对的形式存储和操作数据的容器类型。

image

三个主要的map:

  • Hashtable:线程安全,k-v不能为空
  • HashMap:通用map,元素无序,k-v可以为空(在第一个位置),hashCode()equals()要一致,内部结构由数组和链表相结合(超过阈值,链表退化为树),
  • TreeMap:基于红黑树的有序map。
  • LinkedHashMap:继承HashMap,元素以输入的顺序输出,每次使用了的元素就放在最后,所以前面的就是最近很少使用的(LinkedHashMap就是为LRU缓存而设计的,)。

参考资源: