Collection 类关系图

本文深入解析Java Collections Framework,包括Collection和Map的主要实现类,如HashSet、TreeSet、ArrayList、LinkedList及HashMap等,探讨它们的特点、应用场景及性能差异。

Collection 类关系图
在这里插入图片描述

介绍

容器,就是可以容纳其他Java对象的对象。*Java Collections Framework(JCF)*为Java开发者提供了通用的容器,其始于JDK 1.2,优点是:

降低编程难度
提高程序性能
提高API间的互操作性
降低学习难度
降低设计和实现相关API的难度
增加程序的重用性
Java容器里只能放对象,对于基本类型(int, long, float, double等),需要将其包装成对象类型后(Integer, Long, Float, Double等)才能放到容器里。很多时候拆包装和解包装能够自动完成。这虽然会导致额外的性能和空间开销,但简化了设计和编程。

Collection

容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。

Set

TreeSet

基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。

HashSet

基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。

LinkedHashSet

具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。

List

ArrayList

基于动态数组实现,支持随机访问。

Vector

和 ArrayList 类似,但它是线程安全的。

LinkedList

基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。

Queue

LinkedList

可以用它来实现双向队列。

PriorityQueue

基于堆结构实现,可以用它来实现优先队列。

Map

TreeMap

基于红黑树实现。

HashMap

基于哈希表实现。

HashTable

和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致。它是遗留类,不应该去使用它。现在可以使用 ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。

LinkedHashMap

使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。

### Java Collection 类官方文档与使用教程 #### 1. **Java Collection 框架概述** Java 的 `Collection` 接口是集合框架的核心部分之一,它定义了一组对象的通用行为。所有的集合类都实现了这个接口或者其子接口(如 `List`, `Set`, 和 `Map`)。需要注意的是,虽然 `Collection` 是一个接口而不是具体的实现类,但它提供了许多默认方法供其实现类使用。 以下是关于 `Collection` 接口的一些重要特性及其常见实现类: - **核心接口**: - `Collection`: 所有集合类的基础接口。 - 子接口包括:`List`, `Set`, `Queue`, `Deque` 等。 - `Map`: 虽然不是继承自 `Collection`,但在集合框架中同样占据重要地位。 - **常用实现类**: - `ArrayList`: 基于动态数组的数据结构,支持随机访问[^1]。 - `LinkedList`: 双向链表数据结构,适合频繁插入删除操作。 - `HashSet`: 不允许重复元素的无序集合。 - `TreeSet`: 提供有序存储的功能,基于红黑树实现。 - `HashMap`: 键值对映射关系,键不允许重复。 - `LinkedTransferQueue`: 实现了 `TransferQueue` 接口,用于高效的线程间通信,但它的 `size()` 方法性能较低且结果可能不精确。 --- #### 2. **Collection 接口中常用的方法** 以下是 `Collection` 接口中定义的主要方法列表以及它们的作用说明: | 方法名 | 功能描述 | |---------------------------|--------------------------------------------------------------------------| | `boolean add(E e)` | 将指定元素添加到此集合中 (如果尚未存在)[^1]。 | | `boolean remove(Object o)`| 移除集合中的单个实例 (如果有匹配项)。 | | `int size()` | 返回集合中的元素数量。 | | `boolean isEmpty()` | 判断集合是否为空。 | | `Iterator<E> iterator()` | 返回在此集合上进行迭代的迭代器。 | | `boolean contains(Object o)`| 判断集合是否包含某个特定元素。 | 对于某些特殊类型的集合(例如 `SortedSet` 或者 `NavigableSet`),还会有额外的方法提供更高级别的功能。 --- #### 3. **Collections 工具类简介** 除了基本的 `Collection` 接口外,Java 还提供了一个名为 `Collections` 的工具类,其中包含了大量静态方法用来操作或返回集合。比如可以通过调用 `Collections.unmodifiableXXX(...)` 来创建不可变视版本的各种集合类型。 示例代码展示如何利用 `Collections.synchronizedList` 对现有列表同步化处理从而使其成为线程安全的对象: ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SynchronizedExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); List<String> synchronizedList = Collections.synchronizedList(list); // 添加元素至同步后的列表 synchronizedList.add("Element"); System.out.println(synchronizedList); } } ``` --- #### 4. **实际应用案例分析** 假设我们需要在一个多线程环境中高效地传递消息队列,则可以选择使用 `LinkedTransferQueue`。然而正如前面提到过那样,在查询当前队列长度时需谨慎对待因为这可能会带来较大的开销并且得不到完全一致的结果。 下面是一个简单的例子演示怎样初始化并往里面放入项目然后再取出它们的过程: ```java import java.util.concurrent.LinkedTransferQueue; public class TransferQueueDemo { public static void main(String[] args) throws InterruptedException { LinkedTransferQueue<Integer> queue = new LinkedTransferQueue<>(); Thread producerThread = new Thread(() -> { try { for(int i=0;i<5;i++) { queue.transfer(i); // 阻塞直到消费者接收为止 System.out.println("Produced "+i); } } catch(InterruptedException ex){ Thread.currentThread().interrupt(); } }); Thread consumerThread = new Thread(() -> { while(true){ Integer item = null; try{ item = queue.take(); // 如果队列为空则一直等待直至可用 System.out.println("Consumed "+item); if(item==4){ break;} }catch(Exception ignored){} } }); producerThread.start(); consumerThread.start(); producerThread.join(); consumerThread.join(); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值