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