主要分为:List、Set、Map、Queue
List
存储顺序有序、可重复
- ArrayList:动态数组,大小可变,线程不安全,支持随机访问(RandomAccess)
- Vector:线程安全版ArrayList,一般不用,而使用并发包JUC下的CopyOnWriteArrayList,每次扩容请求其大小的2倍,而ArrayList为1.5倍。
- LinkedList:基于双向链表实现,只能顺序访问,可快速插入删除元素。LinkedList还可以用作栈、队列和双向队列。
Set
- TreeSet:基于红黑树实现,支持有序性操作(例如根据一个范围查找元素),查找效率不如HashSet(HashSet为O(1),TreeSet为O(logN))
- HashSet:基于Hash表实现,支持快速查找,但丢失了有序性操作,且使用Iterator遍历Set的顺序是不确定的。
- LinkedHashSet:具有HashSet的查找效率,且使用一个双向链表维护插入顺序。
Map
- TreeMap:基于红黑树实现。
- HashMap:基于哈希表实现。
- HashTable:线程安全类HashMap,遗留类,推荐使用ConcurrentHashMap。
- LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者LRU顺序。
Queue
- LinkedList:可以用它来实现双向队列。
- PriorityQueue:基于堆来实现,用来实现优先队列。
Iterator迭代器
public interface Iterator<E>{
//集合中是否还有元素
boolean hasNext();
//获得集合中的下一个元素
E Next();
}
迭代器(设计模式的一种),迭代器可以对集合进行遍历。
因每个集合内部的数据结构可能是不尽相同,而迭代器接口定义了统一使用hasNext()
和next()
方法,这样做提供了一种方法访问一个容器,而不需要暴露该对象的内部细节。
迭代器安全的原因:当遍历的集合元素被更改的时候,会抛出ConcurrentModificationException
异常。