一.集合体系架构

List系列集合:添加的元素是有序,可重复,有索引。
Set系列集合:添加的元素是无序,不重复,无索引。
其中Arraylist,LinkedList,Vector,HashSet,TreeSet,LinkedHashSet 是实现类,Collection,List,Set是接口
注意:我们在使用集合时是不能创建接口的对象的,只能创建其实现类的对象。
二.Collection常用方法解析
| 方法签名 | 说明 |
|---|---|
| public boolean add(E e) | 把给定的对象添加到当前集合中,成功返回 true |
| public void clear() | 清空集合中所有的元素 |
| public boolean remove(E e) | 把给定的对象在当前集合中删除,成功返回 true |
| public boolean contains(Object obj) | 判断当前集合中是否包含给定的对象 |
| public boolean isEmpty() | 判断当前集合是否为空 |
| public int size() | 返回集合中元素的个数 / 集合的长度 |
1.add方法注意事项
List 系列(允许重复)
- 返回值永远是
true - 因为 List 允许存储重复元素,所以任何调用
add()的操作都会成功,不会因为元素已存在而失败。
Set 系列(不允许重复)
- 返回值取决于元素是否已存在
- 如果元素不存在,添加成功 → 返回
true - 如果元素已存在,添加失败 → 返回
false
- 如果元素不存在,添加成功 → 返回
- 这是因为 Set 不允许重复元素,它会通过
hashCode()和equals()来判断元素是否已经存在。
2.remove方法注意事项
要注意的是由于LIst系列集合允许重复存在,在使用remove时,并不会删除所有的


3.Contains方法注意事项
contains()的底层原理 :它依赖equals()方法来判断对象是否相等。- 自定义对象的默认行为 :如果
Student类没有重写equals(),就会使用Object类的默认实现,只比较对象的内存地址。 - 实现业务判断的关键 :要让 自定义对象的比较生效,必须在
Student类中重写equals()方法 (通常也会一起重写hashCode())。
重写前:


使用idea的话可以直接生成

重写的代码
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
再次运行

三.集合的通用遍历方式
1.迭代器遍历
获取迭代器
- 方法 :
Iterator<E> iterator() - 作用 :从
Collection集合中获取一个迭代器对象,默认指向集合的起始位置(逻辑上的 0 索引)。 - 说明 :所有实现了
Collection接口的集合(如ArrayList、HashSet)都具备此方法,是遍历集合的通用方式。
| 方法 | 作用 |
|---|---|
| boolean hasNext() | 判断迭代器当前指向的位置是否还有元素 。有元素返回 true,没有则返回 false。 |
| E next() | 获取当前位置的元素,并将迭代器移动到下一个位置。 |
使用示例


2.增强for循环遍历
1. 本质与由来
- 它是 JDK 5 之后引入的语法糖,底层原理就是
Iterator迭代器,目的是简化迭代器的遍历代码。 - 你可以把它看作迭代器的 "简化版",写法更简洁,但底层逻辑完全一致。
2. 适用范围
-
支持所有单列集合 (如
List、Set等实现了Collection接口的集合) -
支持所有数组
for (元素的数据类型 变量名 : 数组或者集合) {
// 循环体,变量名代表当前遍历到的元素
}
使用示例


3.lambda表达式遍历
1. 本质与原理
- 底层依赖
Iterable接口的默认方法forEach(Consumer<? super T> action)。 Consumer是一个函数式接口,正好可以用 Lambda 表达式来实现。- 这种方式无需手动获取迭代器或写循环结构,直接传入一个 "对每个元素要执行的操作" 即可。
2. 适用范围
- 所有实现了
Iterable接口的集合(包括Collection体系的List、Set等)。 - 数组不直接支持,但可以通过
Arrays.stream(arr).forEach(...)间接实现。
使用示例

