Java集合操作与迭代器深入解析
立即解锁
发布时间: 2025-08-20 00:10:09 阅读量: 1 订阅数: 8 

### Java集合操作与迭代器深入解析
#### 1. 集合基本操作
在集合操作中,有一些方法具有特殊的功能。例如,`replace` 方法可以将指定索引位置的元素替换为新元素。对于列表(List),存在重载的 `addAll()` 方法,它允许将新列表插入到原列表的中间位置,而不只是像 `Collection` 中的 `addAll()` 方法那样将元素追加到列表末尾。
同时,`isEmpty()` 方法用于检查列表是否为空,`clear()` 方法则用于清空列表。另外,`toArray()` 方法可以将任何集合转换为数组。该方法是重载的,无参数版本返回 `Object` 数组,若传入目标类型的数组,它会生成指定类型的数组(前提是通过类型检查)。如果传入的数组太小无法容纳列表中的所有对象,`toArray()` 会创建一个大小合适的新数组。
以下是一些相关的练习题:
- **练习5**:修改 `ListFeatures.java`,使其使用 `Integers` 而非 `Pets`,并解释结果的差异。
- **练习6**:修改 `ListFeatures.java`,使其使用 `Strings` 而非 `Pets`,并解释结果的差异。
- **练习7**:创建一个类,初始化该类的对象数组,将数组元素填充到列表中,使用 `subList()` 创建列表的子集,然后从列表中移除该子集。
#### 2. 迭代器(Iterator)
在容器中,插入和取出元素是基本操作。在列表中,`add()` 用于插入元素,`get()` 用于获取元素。但如果想编写通用代码,不依赖于具体容器类型,就需要引入迭代器的概念。
迭代器是一种设计模式,它可以在不关心序列底层结构的情况下遍历序列并选择每个对象。迭代器通常是轻量级对象,创建成本低。Java 的迭代器只能单向移动,其主要操作包括:
1. 使用 `iterator()` 方法从集合获取迭代器,该迭代器准备好返回序列中的第一个元素。
2. 使用 `next()` 方法获取序列中的下一个对象。
3. 使用 `hasNext()` 方法检查序列中是否还有更多对象。
4. 使用 `remove()` 方法移除迭代器最后返回的元素。
以下是一个使用迭代器的示例代码:
```java
//: holding/SimpleIteration.java
import typeinfo.pets.*;
import java.util.*;
public class SimpleIteration {
public static void main(String[] args) {
List<Pet> pets = Pets.arrayList(12);
Iterator<Pet> it = pets.iterator();
while(it.hasNext()) {
Pet p = it.next();
System.out.print(p.id() + ":" + p + " ");
}
System.out.println();
// A simpler approach, when possible:
for(Pet p : pets)
System.out.print(p.id() + ":" + p + " ");
System.out.println();
// An Iterator can also remove elements:
it = pets.iterator();
for(int i = 0; i < 6; i++) {
it.next();
it.remove();
}
System.out.println(pets);
}
} /* Output:
0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat
10:EgyptianMau 11:Hamster
0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat
10:EgyptianMau 11:Hamster
[Pug, Manx, Cymric, Rat, EgyptianMau, Hamster]
*///:~
```
使用迭代器时,无需担心容器中元素的数量,`hasNext()` 和 `next()` 方法会处理这些问题。如果只是简单地向前遍历列表且不修改列表对象本身,`foreach` 语法会更简洁。需要注意的是,`remove()` 方法会移除 `next()` 方法产生的最后一个元素,因此在调用 `remove()` 之前必须先调用 `next()`。
为了创建与容器无关的 `display()` 方法,可以利用迭代器的特性。以下是示例代码:
```java
//: holding/CrossContainerIteration.java
import typeinfo.pets.*;
import java.util.*;
public class CrossContainerIteration {
public static void display(Iterator<Pet> it) {
while(it.hasNext()) {
Pet p = it.next();
System.out.print(p.id() + ":" + p + " ");
}
System.out.println();
}
public static void main(String[] args) {
ArrayList<Pet> pets = Pets.arrayList(8);
LinkedList<Pet> petsLL = new LinkedList<Pet>(pets);
HashSet<Pet> petsHS = new HashSet<Pet>(pets);
TreeSet<Pet> petsTS = new TreeSet<Pet>(pets);
display(pets.iterator());
display(petsLL.iterator());
display(petsHS.iterator());
display(petsTS.iterator());
}
} /* Output:
0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
4:Pug 6:Pug 3:Mutt 1:Manx 5:Cymric 7:Manx 2:Cymric 0:Rat
5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug 0:Rat
*///:~
```
`display()` 方法不包含所遍历序列的类型信息,这体现了迭代器的强大之处:将遍历序列的操作与序列的底层结构分离,因此我们说迭代器统一了对容器的访问。
以下是一些与迭代器相关的练习题:
- **练习8**:修改练习1,使其使用迭代器遍历列表并调用 `hop()` 方法。
- **练习9**:修改 `innerclasses/Sequence.java`,使 `Sequence` 使用迭代器而非选择器。
- **练习10**:修改多态章节中的练习9,使用 `ArrayList` 存储 `Rodents`,并使用迭代器遍历 `Rodents` 序列。
- **练习11**:编写一个方法,使用迭代器遍历集合并打印容器中每个对象的 `toString()` 方法返回值。用不同类型的集合填充对象,并将该方法应用于每个容器。
#### 3. 列表迭代器(ListIterator)
`ListIterator` 是 `Iterator` 的更强大子类型,仅由列表类生成。与只能向前移动的 `Iterator` 不同,`ListIterator` 是双向的。它还可以提供相对于迭代器在列表中指向位置的下一个和上一个元素的索引,并且可以使用 `set()` 方法替换最后访问的元素。
可以通过调用 `listIterator()` 方法生成指向列表开头的 `ListIterator`,也可以通过调用 `listIterator(n)` 方法创建从索引 `n` 开始的 `ListIterator`。以下是一个示例代码:
```java
//: holding/ListIteration.java
import typeinfo.pets.*;
import java.util.*;
public class ListIteration {
public static void main(String[] args) {
List<Pet> pets = Pets.arrayList(8);
ListIterator<Pet> it = pets.listIterator();
while(it.hasNext())
System.out.print(it.next() + ", " + it.nextIndex() +
", " + it.previousIndex() + "; ");
System.out.println();
// Backwards:
while(it.hasPrevious())
System.out.print(it.previous().id() + " ");
System.out.println();
System.out.println(pets);
it = pets.listIterator(3);
while(it.hasNext()) {
it.next();
it.set(Pets.randomPet());
}
System.out.println(pets);
}
} /* Output:
Rat, 1, 0; Manx, 2, 1; Cymric, 3, 2; Mutt, 4, 3; Pug, 5, 4; Cymric, 6,
5; Pug, 7, 6; Manx, 8, 7;
7 6
```
0
0
复制全文
相关推荐










