Java集合框架:集合操作与遍历详解
立即解锁
发布时间: 2025-08-17 02:35:39 阅读量: 16 订阅数: 22 


Java编程基础与SCJP认证指南
### Java集合框架:集合操作与遍历详解
#### 1. 集合概述
在Java编程中,集合是一种非常重要的数据结构,它用于存储和管理一组对象。除了`Vector`和`Hashtable`外,许多集合和映射的实现并非线程安全的,这意味着在并发访问时,它们的数据完整性可能会受到影响。Java集合框架为单线程和并发应用程序提供了丰富的集合和映射,功能十分强大。
#### 2. 集合接口与基本操作
集合接口`Collection`定义了所有集合应实现的契约。该接口中的部分操作是可选的,也就是说,集合可以选择为这些操作提供一个存根实现,当调用时会抛出`UnsupportedOperationException`。`java.util`包中的集合实现支持`Collection`接口的所有可选操作。
集合的基本操作包括查询集合内容、添加和移除元素,以下是具体的方法:
| 方法 | 描述 |
| --- | --- |
| `int size()` | 返回集合的大小 |
| `boolean isEmpty()` | 判断集合是否为空 |
| `boolean contains(Object element)` | 检查集合中是否包含指定元素 |
| `boolean add(E element)` | 向集合中添加元素,若集合被修改则返回`true` |
| `boolean remove(Object element)` | 从集合中移除指定元素,若集合被修改则返回`true` |
`add()`和`remove()`方法在集合被修改时返回`true`。若`add()`方法返回`false`,则表示集合不允许重复元素,且集合中已存在与参数相等的对象。`contains()`方法通过对象值的相等性来检查元素是否存在于集合中。
#### 3. 批量操作
批量操作将集合作为一个整体进行处理,可用于执行类似于集合逻辑的操作,不仅适用于集合,也适用于列表。以下是相关方法:
| 方法 | 描述 |
| --- | --- |
| `boolean containsAll(Collection<?> c)` | 若指定集合的所有元素都包含在当前集合中,则返回`true` |
| `boolean addAll(Collection<? extends E> c)` | 将指定集合的所有元素添加到当前集合中,若集合被修改则返回`true` |
| `boolean removeAll(Collection<?> c)` | 从当前集合中移除指定集合的所有元素,若集合被修改则返回`true` |
| `boolean retainAll(Collection<?> c)` | 仅保留当前集合中与指定集合相同的元素,若集合被修改则返回`true` |
| `void clear()` | 清空集合 |
这些操作的效果可以通过维恩图来直观展示。`addAll()`要求另一个集合的元素类型与当前集合的元素类型相同或为其子类型,而`removeAll()`和`retainAll()`操作可以对任意类型的集合执行。
mermaid代码如下:
```mermaid
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([集合A]):::process -->|addAll| B([集合B]):::process
A -->|removeAll| B
A -->|retainAll| B
```
#### 4. 迭代器的使用
集合提供了迭代器,允许按顺序访问集合中的元素。可以通过调用`Collection`接口的`iterator()`方法获取迭代器。迭代器接口`Iterator`定义了以下方法:
| 方法 | 描述 |
| --- | --- |
| `boolean hasNext()` | 若集合中还有元素未返回,则返回`true` |
| `E next()` | 将迭代器移动到下一个元素并返回当前元素,若没有更多元素则抛出`NoSuchElementException` |
| `void remove()` | 移除最后一次调用`next()`方法返回的元素,若`next()`方法未调用或在最后一次调用`next()`后已调用过`remove()`方法,则会抛出`IllegalStateException`,若不支持移除操作则抛出`UnsupportedOperationException` |
以下是使用迭代器遍历集合的示例代码:
```java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorUsage {
public static void main(String[] args) {
// (1) 创建一个整数列表
Collection<Integer> intList = new ArrayList<Integer>();
int[] values = { 9, 11, -4, 1, 13, 99, 1, 0 };
for (int i : values) {
intList.add(i);
}
System.out.println("Before: " + intList); // (2)
Iterator<Integer> iterator = intList.iterator(); // (3) 获取迭代器
while (iterator.hasNext()) {
// (4) 循环
int value = iterator.next();
// (5) 获取下一个元素
if (value < 1 || value > 10)
// (6) 若元素值不在1到10之间,则移除该元素
iterator.remove();
}
System.out.println("After: " + intList); // (7)
}
}
```
输出结果:
```
Before: [9, 11, -4, 1, 13, 99, 1, 0]
After: [9, 1, 1]
```
在上述示例中,首先创建了一个整数列表,然后使用迭代器遍历列表,移除值不在1到10之间的元素。`java.util`包中的大多数迭代器是快速失败的,即当迭代器已经获取后,通过其他方式对底层集合进行结构修改会使迭代器失效,后续使用该迭代器会抛出`ConcurrentModificationException`。因此,在使用迭代器遍历集合时,推荐使用迭代器的`remove()`方法来删除元素。
#### 5. 使用`for(:)`循环遍历集合
`for(:)`循环可以用于遍历实现了`java.lang.Iterable`接口的数据结构,`Collection`接口继承自`Iterable`接口,因此所有实现`Collection`接口的集合都可以使用`for(:)`循环进行遍历。
`for(:)`循环的结构如下:
```java
for (type variable : expression) statement
```
其中,`expression`的值可以是引用实现了`Iterable`接口的集合的引用值。集合的元素类型`E`必须能够赋值给`for(:)`循环中的变量类型。每次执行循环体时,变量会被赋值为集合中的一个新元素。
以下是使用`for(:)`循环遍历集合的示例代码:
```java
import java.util.ArrayList;
import java.util.Collection;
public class IterateOverCollection {
public static void main(String[] args) {
// 创建一个空的StringBuilder集合
Collection<StringBuilder> words = new ArrayList<StringBuilder>(); // (1)
// 一个StringBuilder数组
StringBuilder[] strArray = {
new StringBuilder("t’noD"), new StringBuilder("etareti"),
new StringBuilder("!em")
};
// 将数组中的StringBuilder添加到集合中
for (StringBuilder str : strArray) {
words.add(str);
}
System.out.println("Before: " + words);
// 遍历StringBuilder集合
for (StringBuilder word : words) {
System.out.print(word.reverse() + " ");
}
System.out.println();
System.out.println("After: " + words);
}
}
```
输出结果:
```
Before: [t'noD, etareti, !em]
Don't iterate me!
After: [Don't, iterate, me!]
```
在`for(:)`循环中对集合进行结构修改(添加或移除元素)会导致`ConcurrentModificationException`。如果集合是有序或排序的,迭代器将按照集合维护元素的顺序进行遍历;如果集合是无序的,则遍历顺序不可预测。
#### 6. 集合与数组的转换
可以使用`toArray()`方法将集合转换为数组,具体方法如下:
| 方法 | 描述 |
| --- | --- |
| `Object[] toArray()` | 返回一个包含集合所有元素的`Object`数组 |
| `<T> T[] toArray(T[] a)` | 将集合元素存储到指定类型的数组中,如果数组足够大,则使用该数组;如果数组太小,则创建一个新的合适大小的数组 |
以下是将集合转换为数组的示例代码:
```java
import java.util.Collection;
import java.util.HashSet;
public class CollectionToArray {
public static void main(String[] args) {
Collection<String> strSet = new HashSet<String>();
strSet.add("2008"); strSet.add("2009"); strSet.add("2010");
int n = strSet.size();
Object[] objects = strSet.toArray(); // (1)
// String[] string = strList.toArray(); // (2) 编译时错误!
Object[] objArray = strSet.toArray(new Object[0]); // (3)
System.out.println("Array size: " + objArray.length);
System.out.println("Array type: " + objArray.getClass().getName());
System.out.println("Actual element type: " + objA
```
0
0
复制全文
相关推荐










