Collection遍历方式
- Collection 是单列集合的顶层接口(祖宗接口),它的功能是全部单列集合都可以继承使用的,所以Collection 里面是一些共性的方法。
- Collection 所有方法被List 和 Set系列集合共享
18.2.1 迭代器遍历
迭代器不依赖索引
迭代器在Java中的类Iterator
,迭代器是集合专用的遍历方式。
Collection集合获取迭代器:
方法名称 | 说明 |
---|---|
Iterator iterator | 返回迭代器对象,默认指向当前集合的0索引 |
Iterator 中常用方法:
方法名称 | 说明 |
---|---|
boolean hasNext( ) | 判断当前位置是否有元素,有返回ture,没有返回fasle |
E next( ) | 获取当前位置的元素,并将迭代器对象移向下一个位置 |
注意细节:
1.报错NoSuchElementException
2.迭代器遍历完毕,指针不会复位
3.循环中只能用一次next方法
4.迭代器遍历过程中,不能用集合的方法进行增加或者删除,如果要删除可以用迭代器里的remove方法进行删除,(目前无法添加)
public class Test {
public static void main(String[] args) {
/*
迭代器遍历相关的三个方法:
Iterator<E> iterator() :获取一个迭代器对象
boolean hasNext() :判断当前指向的位置是否有元素
E next() :获取当前指向的元素并移动指针
*/
// 1.创建集合并添加元素
Collection<String> coll = new ArrayList<>();
coll.add("你");
coll.add("好");
coll.add("啊");
// 2.获取迭代器对象
// 迭代器就好比一个箭头,默认指向集合的0索引处
Iterator<String> it = coll.iterator();
// 3.循环不断的去获取集合中的每一个元素
while (it.hasNext()){
// 4.next()方法:获取元素并移动指针
String str = it.next();
System.out.println(str);//你好啊
}
// 当上面循环结束后,迭代器的指针已经指向最后没有元素的位置
System.out.println(it.next());//报错:NoSuchElementException
// 迭代器遍历完毕,指针不会复位
//如果要继续第二次遍历,只能再此获取一个新的迭代器对象
Iterator<String> it2= coll.iterator();
while (it2.hasNext()){
String str = it2.next();
System.out.print(str);
}
}
}
public class Test02 {
public static void main(String[] args) {
//1.创建集合并添加元素
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
//2.获取迭代器对象
//迭代器就好比是一个箭头,默认指向集合的0索引处
Iterator<String> it = coll.iterator();
//3.利用循环不断的去获取集合中的每一个元素
while (it.hasNext()){
//4.next方法的两件事情:获取元素,并移动指针
String str = it.next();
if ("bbb".equals(str)){
//coll.remove("bbb");此行不可取,因为不能通过集合里的方法删除
it.remove();
}
}
System.out.println(coll);//[aaa, ccc]
}
}
18.2.2 增强for遍历
- 增强for的底层就是迭代器,简化迭代器的代码书写
- JDK5之后,其内部原理就是一个Iterator迭代器
- 所有单列集合和数组才能用增强for进行遍历
格式:
for(元素的数据类型 变量名:数组或者集合){
}
如:
for(String s:list){
sout(s);
}
public static void main(String[] args) {
// 创建集合并添加数据
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
// s其实就是一个第三方变量,在循环的过程中依次表示集合中的每一个数据
for (String s : coll) {
System.out.println(s);//aaa bbb ccc
}
for (String s : coll) {
s = "ddd";
}
System.out.println(coll);//[aaa, bbb, ccc]
修改增强for中的变量,不会改变集合中原本的数据
18.2.3 Lambda表达式遍历
JDK8开始新的技术Lambda表达式,提供了一种更简单直接的遍历集合方式。
方法名称 | 说明 |
---|---|
deafult void forEach(Consumer<? super T> action): | 结合lambda遍历集合 |
public class Test01 {
public static void main(String[] args) {
// 1.创建集合并添加数据
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
// 2.利用匿名内部类的形式
//forEach底层原理:也会自己通过普通for循环遍历集合,依次得到每一个元素
//把得到的每一个元素,传递给下面的accept方法
// s 表示集合中的每一个数据
// coll.forEach(new Consumer<String>() {
// @Override
// public void accept(String s) {
// System.out.println(s);
// }
// });
// 利用匿名内部类改成 lambda表达式:
coll.forEach((String s) ->{
System.out.println(s);//aaa bbb ccc
}
);
// 简化lambda表达式
coll.forEach(s ->System.out.println(s));//aaa bbb ccc
}
}
18.2.4 三种通用遍历方式区别
迭代器:在遍历过程中需要删除元素,使用迭代器
增强for、Lambda:仅想遍历输出,就选这俩