Java集合(一)概述
本文最后更新于:2024年4月16日 下午
一、什么是集合
关于Java集合框架的维基百科定义如下:
Java集合框架(Java collections framework)是一个包含一系列实作可重复使用集合的数据结构的类别和界面集合。 虽然称为“框架”,其使用方式却像个函式库。集合框架提供了定义各式各样集合的界面和实作上述集合的类别。
Java中集合是一个用于存放对象引用的容器,在开发时我们不能确定对象的数量也不能确定它们的类型,因此在存放上就不能用存放同一类型数据的数组,Java为解决这一问题,开发了集合
以下是集合和数组的区别:
数组和集合都是Java中的容器。
数组长度固定,且只能存放相同类型数据;而集合不限数量,不同类型的数据。
数组只能存放的相同类型数据,可以实基本数据类型也可以是引用类型。
集合只能存放对象。比如要存int类型,是转换为了Integer类后存入的。即会将基本数据类型转换为对应的引用类型存入
1
2List<int> intList = new ArrayList<int>();//此处会报错:类型参数不能是原始数据
List<Integer> intList = new ArrayList<Integer>();//改为对应的包装类即可集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。
相应的Java原始类型(基本数据类型)与其对应的包装类:
原始类型(基本数据类型) | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
集合的接口与实现分离
与常见的数据结构类库一样,Java中集合类库也将接口与实现分离。以*队列(queue)*为例
队列接口指出可以在队列尾部添加元素,在首部删除元素,并可以查找元素个数,当需要手机对象,并按照”先进先出“规则检索对象时就应该使用队列。
1 |
|
这个接口并没有说明队列是如何实现的。通常有两种实现:一是循环数组;一是链表
当在程序中使用队列时,一旦构建了集合就不需要知道究竟使用了那种实现方法。因此只有在构建集合对象时使用具体的类才有意义,可以使用接口类型存放集合的引用
1 |
|
利用这种方式,可以轻松修改实现,即修改调用构造器的部位即可
1 |
|
二、集合框架
首先看一下集合的框架图
图中可以看到,集合主要分为Collection(集合)和Map(图)两个接口,Collection存储元素集合,Map存储键/值对映射。(其中Collection接口继承(extends)了Iterable接口,具体体现是实现了Iterator)
- Collection分别被Queue、List和Set继承。下面是一些抽象类,然后是具体类。
- List被AbstractList实现,然后分为3个子类,ArrayList,LinkList和VectorList。
- Set被AbstractSet实现,又分为2个子类,HashSet和TreeSet。
- Map被AbstractMap实现,又分为2个子类,HashMap和TreeMap。
- Map被Hashtable实现。
- 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
- 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
- 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

三、Iterator迭代器
它是Java集合的顶层接口(不包括map系列的集合,Map接口是map系列集合的顶层接口)
- Object next():通过反复调用next方法可以组个访问集合中的元素。但是到达了末尾next方法会抛出NoSuchElementException。因此调用next前先调用hasNext
- 遍历还可以用forEach实现,任何实现了Iterable接口的对象都可以使用
- boolean hasNext():判断容器内是否还有可供访问的元素。
- void remove():删除迭代器刚越过的元素。
所以除了map系列的集合,我么都能通过迭代器来对集合中的元素进行遍历。
注意:我们可以在源码中追溯到集合的顶层接口,比如Collection接口,可以看到它继承的是类Iterable
1 |
|
那这就得说明一下Iterator和Iterable的区别:
Iterable:存在于java.util包中。
1 |
|
看源码可知,Iterable接口里面封装了 Iterator 接口。所以只要实现了Iterable接口的类,就可以使用Iterator迭代器了。
Iterator:存在于java.util包中。核心的方法next(),hasNext(),remove()。
四、Collection操作简介
Collection的作用就是规定了一个集合有哪些基本的操作。在IDEA中ctrl+F12可以查看

可以看到基本上是插入数据、清除数据、是否包含、是否相等、移除元素、转换数组等操作
比如:
int size() 获取元素个数
boolean isEmpty() 是否个数为零
boolean contains(Object element) 是否包含指定元素
boolean add(E element) 添加元素,成功时返回true
boolean remove(Object element) 删除元素,成功时返回true
Iterator
还有些操作整个集合的方法,比如:
boolean containsAll(Collection c) 是否包含指定集合 c 的全部元素
boolean addAll(Collection<? extends E> c) 添加集合 c 中所有的元素到本集合中,如果集合有改变就返回 true
boolean removeAll(Collection<?> c) 删除本集合中和 c 集合中一致的元素,如果集合有改变就返回 true
boolean retainAll(Collection c) 保留本集合中 c 集合中两者共有的,如果集合有改变就返回 true
void clear() 删除所有元素
还有对数组操作的方法:
Object[] toArray() 返回一个包含集合中所有元素的数组
与Collection接口相关还有一个抽象类AbstractCollection:
AbstractCollection是一个抽象类,实现了Collection接口的部分功能,实现了一些最基本的通用操作,把复杂的和业务相关的延迟到子类实现。
在AbstractCollection中,主要实现了contains(), isEmpty(), toArray(), remove(), clear() 这几个操作。
五、Collection源码分析
Collection是一个接口,继承自Iterable。先看一下Iterable接口的源码
1 |
|
在IDEA中ctrl+F12查看Collection的源码,简要分析源码中变量、方法的含义
1 |
|