一、集合框架
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes
1、接口
Java Collections Framework 接口提供抽象数据类型来表示集合。
java.util.Collection
是集合框架的根接口。它位于集合框架层次结构的顶部。它包含一些重要的方法,例如每个 Collection 类都必须实现的 size()、iterator()、add()、remove()、clear()
。
其他一些重要的接口是 java.util.List、java.util.Set、java.util.Queue、java.util.Map
。Map 是唯一不继承自 Collection 接口的接口,但它是 Collections 框架的一部分。所有集合框架接口都存在于 java.util
包中。
2、实现类
Java Collections 框架为核心集合接口提供了实现类。我们可以使用它们在 Java 程序中创建不同类型的集合。
一些重要的集合类是 ArrayList、LinkedList、HashMap、TreeMap、HashSet、TreeSet
。这些类解决了我们大部分的编程需求,但是如果我们需要一些特殊的集合类,我们可以扩展它们来创建我们的自定义集合类。
Java 1.5 提出了线程安全的集合类,允许我们在迭代它们时修改集合。其中一些是CopyOnWriteArrayList、ConcurrentHashMap、CopyOnWriteArraySet
。这些类在 java.util.concurrent
包中。
所有集合类都存在于 java.util
和 java.util.concurrent
包中。
3、集合类图
4、集合框架的好处
- 减少开发工作量——它带有几乎所有常见类型的集合和有用的方法来迭代和操作数据。所以我们可以更专注于业务逻辑,而不是设计我们的集合 API。
- 更好的质量——使用经过充分测试的核心集合类可以提高我们的程序质量,而不是使用任何自己开发的数据结构。
- 可重用性和互操作性
- 减少维护工作,因为每个人都知道 Collection API 类。
二、重要接口
1、Collection
public interface Collection<E> extends Iterable<E> {
}
Collecton
继承另一个接口Iterable
,由下图可以看出Collection
实现了以下方法。
2、List
List集合类中的元素有序(添加顺序和取出顺序一致),可重复。
List集合中的每个元素有其对应的顺序索引
ArrayList
:由数组来实现数据的存储,可以随机访问
Vector
:和ArrayList类似,它是线程安全的
LinkedList
:双向链表实现,可以快速在链表中间插入和删除元素。
3、Set
Set 是一个不能包含重复元素的集合。
TreeSet
:基于红黑树实现,支持有序性操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。
HashSet
:基于哈希表实现,支持快速查找,但不支持有序性操作。使用 Iterator 遍历 HashSet 得到的结果是不确定的。
LinkedHashSet
:具有 HashSet 的查找效率,并且内部使用双向链表维护元素的插入顺序。
4、Queue
Queue是一个集合,用于在处理之前保存多个元素。
Queue 还提供了额外的插入、提取和检查操作。
LinkedList
:可以用它来实现双向队列。
PriorityQueue
:基于堆结构实现,可以用它来实现优先队列。
5、Map
Map是一个将键映射到值的对象。映射不能包含重复的键:每个键最多可以映射到一个值。
TreeMap
:基于红黑树实现。
HashMap
:基于哈希表实现。
HashTable
:和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程同时写入 HashTable 不会导致数据不一致。它是遗留类,不应该去使用它,而是使用 ConcurrentHashMap 来支持线程安全,ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。
LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。
5、迭代器接口
① Iterator()方法
Iterator 接口提供了迭代 Collection 元素的方法。我们可以使用iterator()方法获取迭代器的实例。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("xiaoming");
list.add("xiaohong");
list.add("xiaoli");
list.add("xiaosi");
// 通过Iterator 迭代
Iterator io = list.iterator();
while(io.hasNext()) {
System.out.println(io.next());
}
}
在List接口中实现了iterator方法。该方法类型为Iterator接口。
hasNext():判断是否还有下一个元素,返回boolean类型
next():将下一个元素返回
② foreach
增强for,底层仍然是迭代器,简化版的Iterator
基本语法
for(元素类型 元素名 : 集合名或数组名) {
访问元素
}
public static void main(String[] args) {
List list = new ArrayList();
list.add("xiaoming");
list.add("xiaohong");
list.add("xiaoli");
list.add("xiaosi");
// 通过增强for循环遍历
for (Object x : list) {
System.out.println(x);
}
}
参考资料
JournalDev Java教程