2018-7-23-Java集合框架
23 Jul 2018 | Java |Collection
首先理解一下集合框架的整体设计,下图并没有包括与并发相关的集合,也没有map。
从上图可以看出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是以键值对的形式存储和操作数据的容器类型。
三个主要的map:
- Hashtable:线程安全,k-v不能为空
- HashMap:通用map,元素无序,k-v可以为空(在第一个位置),
hashCode()
和equals()
要一致,内部结构由数组和链表相结合(超过阈值,链表退化为树), - TreeMap:基于红黑树的有序map。
- LinkedHashMap:继承HashMap,元素以输入的顺序输出,每次使用了的元素就放在最后,所以前面的就是最近很少使用的(
LinkedHashMap
就是为LRU缓存而设计的,)。
参考资源: