Java集合-Collection类关系图
Java容器里只能放对象,对于基本类型(int, long, float, double等),需要将其包装成对象类型后(Integer, Long, Float, Double等)才能放到容器里。很多时候拆包装和解包装能够自动完成。这虽然会导致额外的性能和空间开销,但简化了设计和编程。
容器分类
Collection:存储对象的集合
Map:存储键值对(两个对象)的映射表
Set:一种不允许有重复元素的集合
常用的Set实现类有以下几种:
HashSet
基于哈希表实现的Set,具有较高的插入和查找效率,但元素的顺序是无序的。使用 Iterator 遍历 HashSet 得到的结果是不确定的。
TreeSet
基于红黑树实现的Set,元素的顺序是按照比较器或者自然排序进行排序的,具有较高的查找效率,插入和删除效率较低。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。
LinkedHashSet
结合了HashSet和LinkedHashMap的优点,使用哈希表存储元素,并保留元素的插入顺序,同时支持快速的查找操作。具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。
除了上述三种常用的Set实现类,Java集合框架还提供了EnumSet和NavigableSet两种特殊的Set实现类。其中,EnumSet用于处理枚举类型的数据,而NavigableSet则是一个可排序的Set,支持范围查询等操作。
List:元素可重复且有序的集合
List的特点:
- 元素有序:List中的元素是有序的,即元素的插入顺序即为元素的访问顺序。
- 索引定位:List中的元素可以通过索引进行快速查找和访问。
- 可重复元素:List中的元素可以重复,即一个元素可以在List中出现多次。
- 可变大小:List的大小是可变的,可以在插入和删除元素后改变List的大小。
- 限制操作:List中的元素操作有限制,只能在指定位置插入或删除元素,不能像数组一样通过索引直接访问和修改元素。
ArrayList
基于动态数组实现的List,可以通过索引快速访问元素,插入和删除元素时需要移动其他元素,效率较低。
LinkedList
基于双向链表实现的List,可快速在链表中间插入和删除元素,插入和删除元素效率较高,只能顺序访问,访问元素效率较低。LinkedList 还可以用作栈、队列和双向队列
Vector
类似于ArrayList,但是是线程安全的,同时具有ArrayList的高性能。
Stack
基于LinkedList实现的后进先出(LIFO)的栈结构,已经过时,不建议使用。
CopyOnWriteArrayList
基于数组实现的List,在添加元素时会创建一个新数组,然后将原有元素复制到新数组,保证了读操作的高并发性能。
这些List实现类的选择取决于具体的应用场景和需求。如果需要快速随机访问元素,可以选择ArrayList;如果需要快速插入和删除元素,可以选择LinkedList;如果需要线程安全的List,可以选择Vector,但其性能会略低于ArrayList;如果需要栈结构的List,可以选择Stack,但其性能相对较低;如果需要在高并发场景下读操作,可以选择CopyOnWriteArrayList。
Queue
Java集合框架中的接口,表示一个队列。它定义了一些基本的操作,包括入队(add)和出队(poll)等.常见实现:
LinkedList
基于链表实现的队列,提供了快速的入队和出队操作,但随机访问较慢。
ArrayDeque
基于数组实现的队列,可在队头和队尾进行快速的插入和删除操作。
PriorityQueue
基于堆结构实现,用它来实现优先级队列,按照元素的优先级进行出队操作。
DelayQueue
延迟队列,只允许将DelayElement(实现了DelayQueue的时间戳)放入队列,只能被消费者消费,用于实现定时任务等。
LinkedBlockingQueue
链接阻塞队列,实现了线程间的数据传递和同步,适用于多线程并发场景。
ArrayBlockingQueue
基于数组的链接阻塞队列,可以限制队列的最大容量。
ConcurrentLinkedQueue
线程安全的无界队列,基于链接列表实现,具有较高的性能。
MAP
用于存储键值对的集合。它的特点是通过键来获取值,其中键必须是唯一的,而值可以重复。Map中的键和值可以是任意对象。
HashMap
使用哈希表实现的Map,具有很快的访问速度,但元素的插入和删除操作会改变元素的顺序。
TreeMap
使用红黑树实现的Map,可以按照键的自然顺序进行排序,或者根据用户定义的比较器进行排序。
LinkedHashMap
介于HashMap和LinkedHashMap之间的实现,既保留了HashMap的键值映射的快速特性,又保留了元素的顺序。
ConcurrentHashMap
线程安全的HashMap实现,适用于多线程环境下的并发访问。
EnumMap
用于存储Enum类型的键值对的Map实现,键必须是枚举类型。
HashTable
和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致。它是遗留类,不应该去使用它。现在可以使用 ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。