Java中的集合类有哪些?如何分类的?
Java的集合框架中主要包含以下几种数据结构:
- List(列表):有序集合,可以包含重复元素。常见的实现类有ArrayList(基于动态数组实现)和LinkedList(基于链表实现)。
- Set(集合):无序集合,不包含重复元素。常见的实现类有HashSet(基于哈希表实现)和TreeSet(基于红黑树实现)。
- Queue(队列):一种先进先出(FIFO)的数据结构。常见的实现类有LinkedList(也可以作为队列使用)、ArrayDeque(双端队列)和PriorityQueue(优先队列)。
- Stack(栈):一种后进先出(LIFO)的数据结构。在Java中,Stack类继承自Vector类,但现在推荐使用Deque接口的实现类(如ArrayDeque)来代替Stack。
- Map(映射):存储键值对(K-V对)的数据结构。常见的实现类有HashMap(基于哈希表实现)和TreeMap(基于红黑树实现)。
从继承关系上讲,List、Set和Queue都是Collection接口的子接口,而Collection接口又继承了Iterable接口。这意味着这些集合都是可以遍历的。
从功能上讲:
- List代表一个有序容器,元素可以重复。
- Set是无序的(除了TreeSet,它是有序的),并且元素不可重复。
- Map存储键值对,通过键来访问值。
从实现上讲:
- List可以通过链表(如LinkedList)或数组(如ArrayList)实现。
- Queue可以有不同的实现,如优先队列(PriorityQueue)和双端队列(ArrayDeque)。
- Map的实现包括普通的HashMap和可以排序的TreeMap。
知识扩展:
Collection和Collections有什么区别?
- Collection是一个集合接口,提供了对集合对象进行基本操作的通用接口方法。它是List、Set等的父接口。
- Collections是一个包装类,包含各种有关集合操作的静态多态方法。它不能实例化,就像一个工具类,服务于Java的Collection框架。
Java中的Collection如何遍历迭代?
- 传统的for循环遍历,基于计数器。
- 迭代器遍历,使用Iterator接口。
- foreach循环遍历,内部也是采用了Iterator的方式实现。
- 迭代器遍历,使用Enumeration接口,这是Iterator的“古老版本”。
- Stream API,JDK 1.8中新增,使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。
Iterable和Iterator如何使用?
- Iterator接口代表迭代的方式,包含next和hasNext方法。
- Iterable接口代表的是是否可以迭代,如果可以迭代,会返回Iterator接口,即返回迭代方式。
为什么不把Iterable和Iterator合成一个使用?
- Iterable和Iterator并不是同时出现的,Iterator先于Iterable出现,目的是为了代替Enumeration。
- 将“是否可以迭代”和“迭代方式”抽出来,更符合单一职责原则,使得迭代方式可以被多个可迭代的集合复用,更符合面向对象的特点。