这个博客总结得挺好Java - 集合框架完全解析 -
Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。大概分为两种类型容器:(其中Java集合类里面最基本的接口有:)
一、Collection(集合类):代表一组对象,每一个对象都是它的子元素,存储元素集合。分为:
Set:不包含重复元素的Collection(HashSet不排序、LinkedHashset排序)
List:有顺序的collection,并且可以包含重复元素。(ArrayList数组存储元素,LinkedList链表存储元素)
Queue:队列(先进先出,用LinkedListed创建队列)(PriorityQueue:优先队列,是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。不是线程安全的,入队和出队的时间复杂度是O(log(n))。
二、Map:图,存储键/值对映射。可以把键(key)映射到值(value)的对象,键不能重复。
Map(HashMap无序,LinkedHashMap按插入或访问顺序 ,TreeMap 按键值排序)
三、其他
1、Vector
2、Stack(栈,继承Vector)
3、HashTable
4、CocurrentHashMap(并发,安全性)
5、CopyOnWriteArrayList(线程安全)
迭代器Iterator :迭代器(Iterator) - CSDN博客
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象。Java中的Iterator功能比较简单,并且只能单向移动:
常用方法:
(1)iterator():要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) next():获得序列中的下一个元素。
(3) hasNext():检查序列中是否还有元素。
(4) remove():将迭代器新返回的元素删除。
使用iterator()方法时经常会遇到ConcurrentModificationException异常
主要原因:当调用容器的iterator()方法返回Iterator对象时,把容器中包含对象的个数赋值给了一个变量expectedModCount,在调用next()方法时会比较变量expectedModCount与容器中实际对象的个数modCount的值是否相等,若二者不相等,则会抛出ConcurrentModificationException异常,因此在使用Iterator遍历容器的过程中,如果对容器进行增加或删除操作,就会改变容器中对象的数量,从而导致抛出异常。
单线程解决办法:在遍历的过程中把需要删除的对象保存到一个集合中,等遍历结束后再调用removeAll()方法来删除,或者使用iterator.remove()方法。
多线程解决方法:
1)在JDK1.5版本引入了线程安全的容器,比如ConcurrentHashMap和CopyOnWriteArrayList等。可以使用这些线程安全的容器来代替非线程安全的容器。
2)在使用迭代器遍历容器时对容器的操作放到synchronized代码块中,但是当引用程序并发程度比较高时,这会严重影响程序的性能。