一、分类
容器主要包含 Collection 和 Map,Collection 存储的是对象集合(单个对象),而 Map 存储的是键值对(两个对象)的映射表。
Collection
- Set:无顺序,元素不可重复。
- List:有顺序,元素可重复。
- Queue:先进先出(FIFO)。
1、Set
TreeSet
:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但查找效率不如 HashSet ,HashSet查找的时间复杂度为O(1),TreeSet的则是O(logN)。HashSet
:基于哈希表实现,支持快速查询,但不支持有序性操作,并且失去元素插入顺序信息。LinkedHashSet
:基于双向链表和哈希表实现,具有HashSet的查找效率,内部使用双向列表维护元素的插入顺序。
2、List
ArrayList
:基于动态数组实现,支持随机查询。线程不安全,访问速度快。Vector
:和ArrayList类似,支持随机查询,但线程安全,访问速度慢。LinkedList
:基于双向链表实现,只能顺序访问,但可以快速的在链表中间插入或删除元素。可以使用LinkedList作为栈,队列,双向队列。
3、Queue
LinkedList
:基于双向链表实现,可以用它来实现双向队列。PriorityQueue
:基于堆结构实现,可以用它来实现优先队列。
Map
TreeMap
:基于红黑树实现HashMap
:基于哈希表实现Hashtable
:和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程同时写入Hashtable 不会导致数据不一致。这是遗留类,不应该使用它,使用ConcurrentHashMap
支持线程安全,且ConcurrentHashMap效率更高,因为它使用的是分段锁。LinkedHashMap
:基于双向链表实现,使用双向链表维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。
二、容器中的设计模式
迭代器模式
- 迭代器模式:让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构。
- Iterator : 迭代器对象
public interface Iterator<E> {
boolean hasNext();//判断是否有下一个元素
E next();//将游标指向下一个元素
}
- Iterable :容器实现Iterable接口,获取迭代器对象
public interface Iterable<T> {
Iterator<T> iterator();//获取迭代器对象
}
适配器模式
- 适配器模式:将一个类的接口转换成客户希望的另外一个接口,让原来不兼容的两个接口协同工作。
java.util.Arrays#asList()
可以把数组类型转换为 List 类型
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}