1. Java集合框架
Java集合框架(Collections Framework)是Java中用于存储和操作对象集合的一组类和接口。它提供了一套通用的、高效的数据结构和算法,用于处理各种类型的数据集合,包括列表、集合、映射等。
Java集合框架主要包括两种类型的容器,一种是存储元素集合的集合(Collection),另一种是存储键值对映射关系的图(Map),其中Collection接口有三种子类型:List、Set和Queue,常用的实现类有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等。
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
1.接口(Interfaces)
- Collection:代表一组对象的集合,包括List、Set和Queue等子接口。
- List:有序的集合,允许存储重复的元素。
- Set:无序的集合,不允许存储重复的元素。
- Queue:先进先出(FIFO)的集合,用于存储元素并支持元素的出队和入队操作。
- Map:代表一组键值对的映射关系。
2.实现类(Implementations)
- ArrayList、LinkedList:List接口的实现类,分别基于数组和链表实现。
- HashSet、LinkedHashSet、TreeSet:Set接口的实现类,分别基于哈希表、链表和红黑树实现。
- PriorityQueue:Queue接口的实现类,基于优先级堆实现。
- HashMap、LinkedHashMap、TreeMap:Map接口的实现类,分别基于哈希表、链表和红黑树实现。
3.算法(Algorithms)
- 排序算法:Java集合框架提供了对集合进行排序的算法,如Collections.sort()方法和Arrays.sort()方法,能够对List集合和数组进行排序。
- 查找算法:Java集合框架提供了对集合进行查找的算法,如Collections.binarySearch()方法,能够在有序集合中进行二分查找。
- 遍历算法:Java集合框架提供了对集合进行遍历的算法,如使用迭代器(Iterator)或增强for循环来遍历集合中的元素。
2. 集合框架体系
3. 集合接口
集合框架定义了一些接口:
-
Collection接口
描述:Collection接口是所有集合的根接口,代表一组对象的集合。它提供了通用的集合行为和功能,包括添加、删除、查找、遍历等操作。
子接口:List、Set、Queue等。 -
List接口
描述:List接口表示有序的元素集合,允许存储重复的元素。列表中的每个元素都有一个索引,可以通过索引来访问元素。列表允许按照插入顺序或者指定顺序进行访问。
主要实现类:ArrayList、LinkedList。 -
Set接口
描述:Set接口表示无序的元素集合,不允许包含重复的元素。Set集合中的元素没有顺序,不能通过索引来访问元素。Set集合通常用于存储不重复的元素。
主要实现类:HashSet、LinkedHashSet。 -
Queue接口
描述:Queue接口表示一种先进先出(FIFO)的数据结构,用于存储元素并支持元素的出队和入队操作。队列中的元素按照插入顺序排列,并且从队列中移除元素时是按照队列的头部先进先出的顺序进行的。
主要实现类:LinkedList、PriorityQueue。 -
Map接口
描述:Map接口表示一组键值对的映射关系,其中每个键对应一个值。Map集合中的键不能重复,但值可以重复。Map接口提供了丰富的键值对操作,包括插入、删除、查找等。
主要实现类:HashMap、LinkedHashMap、TreeMap。
Set和List的区别
- 存储方式
List:List是有序的集合,它按照元素的插入顺序来存储元素。每个元素都有一个索引,可以根据索引来访问元素。
Set:Set是无序的集合,它不保证元素的顺序,即元素在集合中的位置没有特定的顺序。 - 是否允许重复元素
List:List允许存储重复的元素,即列表中可以包含相同的元素。
Set:Set不允许存储重复的元素,每个元素在集合中只能出现一次。 - 实现类和特点
List的常用实现类包括ArrayList、LinkedList等。ArrayList基于动态数组实现,支持快速随机访问元素;LinkedList基于链表实现,支持快速插入和删除元素。
Set的常用实现类包括HashSet、LinkedHashSet等。HashSet基于哈希表实现,具有快速的查找速度;LinkedHashSet继承自HashSet,同时使用链表维护插入顺序。 - 适用场景
List适合需要按照插入顺序存储元素,并且可能包含重复元素的场景,如需要维护一个有序的列表或允许用户输入重复内容的情况。
Set适合需要存储独一无二元素的场景,如去重操作、集合运算等。
4. 标准集合类
Java提供了一套实现了Collection接口的标准集合类。其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的部分实现。
具体类(Concrete Classes)
- ArrayList:基于动态数组实现的列表,支持快速随机访问和动态扩容。
- LinkedList:基于双向链表实现的列表,支持快速插入和删除操作,但访问速度相对较慢。
- HashSet:基于哈希表实现的集合,不保证元素的顺序,不允许重复元素。
- LinkedHashSet:继承自HashSet,使用链表维护元素的插入顺序,遍历顺序与插入顺序一致。
- HashMap:基于哈希表实现的映射,使用键值对存储数据,键不能重复。
- LinkedHashMap:继承自HashMap,使用链表维护键值对的插入顺序,遍历顺序与插入顺序一致。
- PriorityQueue:基于堆结构实现的优先队列,元素按照优先级顺序进行排序。
抽象类(Abstract Classes)
- AbstractList:List接口的抽象实现类,提供了对列表的部分实现。
- AbstractSet:Set接口的抽象实现类,提供了对集合的部分实现。
- AbstractMap:Map接口的抽象实现类,提供了对映射的部分实现。
5. 集合算法
Java集合框架中提供了一些常用的算法,这些算法可以应用于集合和映射的操作。以下是一些常见的集合算法:
-
排序算法(Sorting Algorithms)
Collections.sort(List list):对列表进行排序。使用默认的自然排序(natural ordering)。
Collections.sort(List list, Comparator<? super T> comparator):对列表进行排序,使用指定的比较器。 -
查找算法(Searching Algorithms)
Collections.binarySearch(List<? extends Comparable<? super T>> list, T key):在有序列表中使用二分查找算法查找元素的索引。
Collections.binarySearch(List<? extends T> list, T key, Comparator<? super T> c):在有序列表中使用指定的比较器进行二分查找。 -
复制算法(Copying Algorithms)
Collections.copy(List<? super T> dest, List<? extends T> src):将源列表中的元素复制到目标列表中。 -
填充算法(Filling Algorithms)
Collections.fill(List<? super T> list, T obj):用指定的对象填充列表的所有元素。 -
最大值和最小值算法(Maximum and Minimum Algorithms)
Collections.max(Collection<? extends T> coll):返回集合中的最大元素。
Collections.min(Collection<? extends T> coll):返回集合中的最小元素。 -
比较算法(Comparison Algorithms)
Collections.disjoint(Collection<?> coll1, Collection<?> coll2):检查两个集合是否没有交集。
6. 总结
Java集合框架提供了预先包装的数据结构和算法,用于操纵集合对象。集合是一种对象,可以容纳其他对象的引用,而集合框架中的类和接口声明了针对不同类型集合可执行的操作。这些类和接口都位于java.util包中。
当对象被加入集合类中时,它们会自动转换为Object类型。因此,在取出对象时需要进行强制类型转换,这种自动转换为Object类型的特性使得集合类可以存储各种类型的对象。