菜鸡小白为了巩固才写的。
一、数据集合的三种主要操作
1. 遍历集合中的所有元素
2. 按照内容在集合中查找对象
3.
向集合中插入、删除和修改对象
这里要讲的集合迭代器就是用来遍历集合的。
二、集合的遍历操作
最常用的一种集合操作是遍历操作,也就是一个一个地逐个访问集合中的所有元素。
- ▪ 诸如数组、ArrayList等对象集合,支持传统的for循环。
- ▪ JDK为各种集合遍历提供了另一种“通用”的方式——迭代器对象(Iterator),为了简化其代码编写,JDK 5(及以上版本)提供了foreach循环来遍历集合。(Iterator可以适用于所有的集合。Java的foreach循环,其实就是通过Iterator实现的)
三、使用迭代器遍历集合
所有实现了Collection接口的集合 对象,都提供了一个iterator()方法, 以获取一个iterator对象
Iterator<E>接口定义了3个方法:
public Iterator<E> {
boolean
hasNext
(); //
是否还有下一个元素
E
next
();
//
获取下一个元素
void
remove
(); //
移除
iterator
返回的上一个元素
}
实现了
Iterator<E>
接口的对象称为“
迭代
器
”,使用它可以遍历集合。
示例(只有迭代器)
package iterator;
import java.util.*;
public class TestIterator {
public static void main(String[] args) {
//创建一个集合
Collection<String> books = new HashSet<>();
books.add("One book");
books.add("Two book");
books.add("Three book");
//获取books集合对应的迭代器
Iterator<String> it = books.iterator();
//使用迭代器遍历集合
while (it.hasNext()) {
String book = (String) it.next();
System.out.println(book);
}
System.out.println("集合中的元素为:" + books);
it = books.iterator();
//在迭代的过程中同时加工每个元素
it.forEachRemaining(book->{
System.out.println(book.toUpperCase());
} );
}
}
对代码的解释:
- Iterator<String> it = books.iterator();这句话以后,it指向books集合的开头(在第一个元素之前,并不指向第一个元素)。
- it.hasNext()用来判断是否还有下一个元素,第一次调用的时候,下一个元素是"One book"且存在,所以进入while循。
- it.next()这句代码的返回值是E,在该代码中E是String,所以it.next()会在将it往后移的同时返回下一个值的内容,在第一次调用的时候,it开始指向"One Book",并将"One Book"返回给book。
- forEachRemaining是Iterator接口中的一个默认方法,它接受一个
Consumer
类型的参数(一个函数式接口),用于处理迭代器中当前指针位置之后的所有剩余元素。 - book->{System.out.println(book.toUpperCase());}是一个Lambda表达式。由于forEachRemaining接受的参数是一个函数式接口,而函数式接口是利用Lambda所实现的,所以这里面就是一串Lambda表达式。一个形参,没有return的Lambda表达式。
- toUpperCase:将字符串转换为大写字母,book.toUpperCase()会有一个返回值,返回值就是全部是大写英文字母的字符串.
四、集合的ForEach遍历
JDK 5以后,Collection接口派生自Iterable,因此JDK中内置的
所有
集合都可以使用新的foreach语句完成遍历工作。
示例
package iterator;
import java.util.*;
public class TestForeach {
public static void main(String[] args) {
//创建一个集合
Collection<String> books = new HashSet<String>();
books.add("One book");
books.add("Two book");
books.add("Three book");
for (var book : books) {
System.out.println(book);
}
System.out.println(books);
//使用Lambda表达式特性(方法引用)可以方便地遍历集合
books.forEach(System.out::println);
}
}
for (var book : books) {
System.out.println(book);
}这就是一段foreach循环
books.forEach(System.out::println):集合对象有一个forEach()方法,它可以接收一个Lambda表达式,可用于遍历集合元素,它与foreach循环不是一回事,foreach循环是一种语法特性,forEach则是JDK为集合类型提供的一个方法。
五、遍历时删除元素的正确方法(利用迭代器)(不建议遍历时删除元素)
package iterator;
import java.util.*;
public class TestIteratorSucceed {
public static void main(String[] args) {
//创建一个集合
Collection<String> books = new HashSet<>();
books.add("One book");
books.add("Two book");
books.add("Three book");
//获取books集合对应的迭代器
Iterator<String> it = books.iterator();
while(it.hasNext()) {
String book = it.next();
System.out.println(book);
if (book.equals("One book")) {
//使用Iterator迭代过程中,通过它来移除集合元素是安全的
it.remove();
}
}
System.out.println("移除元素之后:"+books);
}
}