目录
Collection的遍历方式
迭代器
- 选代器是用来遍历集合的专用方式(数组没有选代器),在Java中选代器的代表是lterator。
Collection集合获取选代器的方法
方法名称 | 说明 |
---|---|
Iterator<E> iterator() | 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素 |
Iterator选代器中的常用方法
方法名称 | 说明 |
---|---|
boolean hasNext() | 询问当前位置是否有元素存在,存在返回true,不存在返回false |
E next() | 获取当前位置的元素,并同时将选代器对象指向下一个元素处。 |
具体实现
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("凌翔茜");
c.add("蒋川");
c.add("余周周");
c.add("林杨");
System.out.println(c);
//c = [凌翔茜, 蒋川, 余周周, 林杨]
//使用迭代器遍历集合
//1.从集合对象中获取迭代器对象
Iterator<String> it = c.iterator();
//2.结合循环进行遍历
while(it.hasNext()){
String ele = it.next();
System.out.println(ele);
}
}
}
运行结果:
它的执行流程是:
首先迭代器对象指向的是集合中的第一个元素,来到第一行代码,hasNext方法先查看当前位置是否有元素,只要有元素就执行while循环;然后next方法获取到当前位置的元素,同时将迭代器指向下一个元素的位置,一次循环结束则输出一个元素,直到hasNext查看到当前位置已无元素,则循环结束,集合遍历完成。
注意:不能一次性输出集合内的2个或2个以上的元素值,这样有极大的可能会造成异常。
(例如最后一个元素时,next方法再指向下一个元素值,已经是为null值了,不允许再继续访问了)
例如:
增强for循环(foreach)
- 增强for可以用来遍历集合或者数组。
- 增强for遍历集合,本质就是迭代器遍历集合的简化写法。
格式
for(元素的数据类型 变量名:数组或者集合){
}
Collection<String> c = new ArrayList<>();
...
for(String s:c){
System.out.println(s);
}
具体实现
package user.Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("凌翔茜");
c.add("蒋川");
c.add("余周周");
c.add("林杨");
//使用增强for遍历集合或者数组
for (String ele:c) {
System.out.println(ele);
}
System.out.println();
String[] names = {"赵敏","小昭","素素","灭绝"};
for (String name:names){
System.out.println(name);
}
}
}
运行结果:
Lambda表达式遍历集合
- 得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的方式来遍历集合。
需要使用Collection的如下方法来完成
方法名称 | 说明 |
---|---|
default void forEach(Consumer<? super T> action) | 结合Lambda遍历集合 |
具体实现
package user.Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Consumer;
public class IteratorDemo {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("凌翔茜");
c.add("蒋川");
c.add("余周周");
c.add("林杨");
//default void forEach(Consumer<? super T> action):结合Lambda表达式遍历集合
c.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
c.forEach( s -> System.out.println(s) );
c.forEach( System.out::println);
}
}
运行结果应该是循环遍历了三次集合的:
案例
需求与分析
需求:展示多部电影信息。(电影展示信息不限)
完成这个案例的目的:
- 加深对集合遍历的掌握
- 回顾一下集合存储对象的特点
分析
- 每部电影都是一个对象,多部电影要使用集合装起来。
- 遍历集合中的3个电影对象,输出每部电影的详情信息。
代码部分
定义电影类
public class Movie {
private String name;
private double score;
private String actor;
public Movie() {
}
public Movie(String name, double score, String actor) {
this.name = name;
this.score = score;
this.actor = actor;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
@Override
public String toString() {
return "Movie{" +
"name='" + name + '\'' +
", score=" + score +
", actor='" + actor + '\'' +
'}';
}
}
主程序
import java.util.ArrayList;
import java.util.Collection;
public class MovieTest {
public static void main(String[] args) {
//1.创建一个集合容器负责存储多部电影信息
Collection<Movie> movies = new ArrayList<>();
movies.add(new Movie("肖申克的救赎",9.7,"罗宾斯"));
movies.add(new Movie("霸王别姬",9.6,"张国荣、张丰毅"));
movies.add(new Movie("阿甘正传",9.5,"汤姆.汉克斯"));
System.out.println(movies);
for(Movie movie:movies){
System.out.println("电影名: " + movie.getName());
System.out.println("评分: " + movie.getScore());
System.out.println("主演: " + movie.getActor());
System.out.println("-----------------------------------------------------");
}
}
}
运行结果
END
学习自:黑马程序员——JavaSE课程