一、集合框架(Collections Framework) 是什么
Java集合框架
是Java编程语言的核心部分之一。集合几乎在每一种编程语言中都使用。大多数编程语言都支持各种类型的集合,如List、Set、Queue、Stack等。
集合类似于将多个项组合在一个单元中的容器。例如,一罐巧克力,一串名字等等。
集合在每一种编程语言中都使用, 当Java出现时,它也出现了一些集合类——Vector、Stack、Hashtable、Array。
Java 1.2提供了集合框架,它是在Java中以标准方式表示和操作集合的体系结构。
Java集合框架由以下部分组成:
-
接口(Interfaces )
Java集合框架接口
提供了表示集合的抽象数据类型。java.util.Collection
是集合框架的根接口,它位于集合框架层次结构的顶部。
它包含一些重要的方法,如size()、iterator()、add()、remove()、clear(),每个Collection类都必须实现这些方法。
其他一些重要的接口是java.util.List
,java.util.Set
,java.util.Queue
和java.util.Map
。
Map
是唯一不从Collection接口继承的接口,但它是Collections框架的一部分。
所有集合框架接口都在java中的util包。 -
实现类(Implementation Classes)
Java集合框架接口
为核心集合接口提供了实现类。我们可以使用它们在Java程序中创建不同类型的集合。一些重要的集合类有
ArrayList、LinkedList、HashMap、TreeMap、HashSet和TreeSet
。
这些类解决了我们的大部分编程需求,但是如果我们需要一些特殊的集合类,我们可以扩展它们来创建我们的自定义集合类
。
Java 1.5提供了线程安全的集合类
,允许我们在遍历集合时修改它们。其中有CopyOnWriteArrayList, ConcurrentHashMap, CopyOnWriteArraySet
。这些类在java.util.concurrent包中。
所有的集合类都在java.Util和java.util.concurrent包。
-
算法(Algorithms)
算法是提供一些常见功能的有用方法,如搜索(searching)、排序(sorting)和洗牌(shuffling)。
二、集合框架类图(Collections Framework Class Diagram)
类图的下面显示了集合框架的层次结构。
三、Java集合框架的优点 (Benefits of Java Collections Framework)
Java集合框架有以下优点:
- 减少开发工作
它提供了几乎所有常见的集合类型以及迭代和操作数据的有用方法。因此,我们可以更多地专注于业务逻辑,而不是设计我们的集合API。
- 高质量
使用经过良好测试的核心集合类比使用任何自己开发的数据结构提高了程序的质量。
- 复用性和互用性
- 减少计算量
因为每个人都知道Collection API类。
四、Java集合 API接口
Java集合接口是Java集合框架的基础。
注意,所有的核心集合接口都是通用的;例如公共接口Collection。语法用于泛型,当我们声明集合时,应该使用它来指定它可以包含的对象类型。通过在编译时对object进行类型检查,它有助于减少运行时错误。
为了使核心集合接口的数量易于管理,Java平台不为每种集合类型的每种变体提供单独的接口。如果调用不支持的操作,集合实现将抛出UnsupportedOperationException
。
4.1 Collection 接口
这是集合层次结构的根。集合表示一组称为其元素的对象。Java平台没有提供这个接口的任何直接实现。
接口有一些方法来告诉你:
- 集合中有多少元素(size, isEmpty)
- 来检查给定对象是否在集合中 (contains)
- 向集合中添加或删除一个元素 (add, remove)
- 提供集合上的迭代器(iterator)
集合接口还提供对整个集合工作的批量操作方法:
- containsAll, addAll, removeAll, retainAll, clear.
提供toArray方法是作为集合和旧的 api之间的桥梁,旧的 api期望在输入时使用数组。
4.2 Iterator接口
4.3 Set 接口
4.4 List 接口
4.5 Queue接口
4.6 Dequeue 接口
4.7 Map 接口
4.8 ListIterator 接口
4.9 SortedSet 接口
4.10 SortedMap 接口
五、 Java集合 类
Java集合框架框架附带了许多用于接口的实现类。最常见的实现是ArrayList、HashMap和HashSet
。
Java 1.5包含了并发实现;例如ConcurrentHashMap和CopyOnWriteArrayList。
通常集合类不是线程安全的,它们的迭代器是 fail-fast
(快速失败)的。
在本节中,我们将学习常用的集合类。
5.1 ArrayList 类
5.2 LinkedList类
5.3 TreeSet 类
5.4 HashSet 类
5.5 TreeMap 类
5.6 PriorityQueue 类
5.7 集合类的区别
集合 | 是否元素有序 | 是否随机访问 | 是否键值对 | 是否重复元素 | 是否空元素 | 是否线程安全 |
---|---|---|---|---|---|---|
ArrayList | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
LinkedList | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ |
HashSet | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ |
TreeSet | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
HashMap | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ |
TreeMap | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
Vector | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
Hashtable | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
Properties | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
Stack | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
CopyOnWriteArrayList | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
ConcurrentHashMap | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
CopyOnWriteArraySet | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
六、 Collections 类
Java Collections类只由操作或返回集合的静态方法组成。它包含操作集合的多态算法、“包装器”(它返回一个由指定集合支持的新集合)以及其他一些零散的东西。
这个类包含集合框架算法的方法,如二分搜索、排序、洗牌、反向等。
七、 同步包装器
同步包装器将自动同步(线程安全)添加到任意集合。六个核心集合接口(collection、Set、List、Map、SortedSet和SortedMap)中的每一个都有一个静态工厂方法。
public static Collection synchronizedCollection(Collection c);
public static Set synchronizedSet(Set s);
public static List synchronizedList(List list);
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);
public static SortedSet synchronizedSortedSet(SortedSet s);
public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m);
这些方法都返回由指定集合备份的同步(线程安全)集合。
八、 不可变包装器
不可修改的包装器通过拦截所有会修改集合的操作并抛出UnsupportedOperationException,从而剥夺了修改集合的能力。它的主要用法是:
- 使集合在构建后成为不可变的。在这种情况下,最好不要维护对后台集合的引用。这绝对保证了永恒性。
- 允许某些客户端只读访问您的数据结构。您保留对支持集合的引用,但提供对包装器的引用。通过这种方式,客户机可以查看但不能修改,而您可以保持完全访问。
public static Collection unmodifiableCollection(Collection<? extends T> c);
public static Set unmodifiableSet(Set<? extends T> s);
public static List unmodifiableList(List<? extends T> list);
public static <K,V> Map<K, V> unmodifiableMap(Map<? extends K, ? extends V> m);
public static SortedSet unmodifiableSortedSet(SortedSet<? extends T> s);
public static <K,V> SortedMap<K, V> unmodifiableSortedMap(SortedMap<K, ? extends V> m);
九、 线程安全 集合类
Java 1.5并发包(Java .util. Concurrent)包含线程安全的集合类,允许在迭代时修改集合。根据设计,迭代器是 fail-fast
快速失败的,并抛出ConcurrentModificationException。这些类有CopyOnWriteArrayList, ConcurrentHashMap, CopyOnWriteArraySet。
- 避免ConcurrentModificationException
- CopyOnWriteArrayList 实例
- HashMap 和 ConcurrentHashMap 区别
十、 集合 API 算法
Java 集合框架 提供了常用的算法实现,比如排序和搜索。集合类包含这些方法实现。
这些算法中的大多数都适用于List,但有些算法适用于所有类型的集合。
10.1 排序(Sorting )
10.1 洗牌(Shuffling)
10.1 搜索(Searching)
10.1 最小最大 值(Min and Max values)
十一、 Java8 集合 API 新特性
Java 8最大的变化与集合api有关。一些重要的变化和改进是:
- 介绍用于顺序处理和并行处理的流API
- Iterable接口使用forEach()默认方法进行了扩展,用于在集合上迭代。
- Lambda表达式和函数接口对Collection API类非常有益。
十二、 Java 10 集合 API 新特性
list.copyOf Set.copyOf和Map.copyOf
方法创建不可修改的集合。- collector类获取各种方法来收集不可修改的集合(Set、List、Map)。
这些方法名是tounmodifiableelist, toUnmodifiableSet和toUnmodifiableMap。