为什么要使用迭代器来遍历集合呢?
- 迭代器的使用方式:
迭代器:-> 将集合看做成一个公共汽车时,其中的乘客就是一个个数据,如果我想遍历出每个数据,或者说是查找某一个乘客的话,让售票员去找(迭代器iterator),这就不会暴露内部数据和结构,提高安全性 - GOF给迭代器的定义:
GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。
Collection接口继承了Java.lang.Iterater下的Iterater接口
因此Collection接口下的子类都可以继承Iterater下的所有方法
因此可以使用迭代器遍历,Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建Iterator 对象,则必须有一个被迭代的集合。因此必须使用迭代器进行遍历
使用迭代器遍历集合的优点:
1.可以不了解集合内部的数据结构,就可以直接遍历
2.不暴露内部的数据,可以直接外部遍历;
3.适用性强,基本上的集合都能使用迭代器;
使用迭代器遍历的细节:
package com.text;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
Iterator<String> it1 = coll.iterator();
while (it1.hasNext()) {
String str = it1.next();
System.out.println(str);
}
System.out.println("");
Iterator<String> it2 = coll.iterator();
while (it2.hasNext()) {
String str = it2.next();
System.out.println(str);
}
}
}
以上代码的输出结果为:
aaa
bbb
ccc
ddd
aaa
bbb
ccc
ddd
两个迭代器用来遍历同一个集合,当遍历完以后迭代器的指针会指向空元素的位置,并无法复原,因此当前迭代器自然就成了垃圾
接下来问题出现了:
如果迭代器过多的话,会不会造成爆内存的现象呢?
1. 答案是不会的。
当Iterator对象不再被引用时,它们会成为垃圾对象。Java的垃圾回收机制会定期检查内存中的对象,发现不再被引用的对象后,将其标记为可回收对象,并在适当的时机进行回收释放内存。
这样就能确保程序在运行过程中不会因为内存泄漏而导致内存溢出等问题。
另外:Java还提供了其他两种遍历集合的方式
1. 增强for遍历
package com.text;
import java.util.*;
public class Test {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
for (Object s : coll) {
System.out.println(s);
}
}
}
2. lambda表达式遍历
package com.text;
import java.util.*;
public class Test {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
/*for (Object s : coll) {
System.out.println(s);
}*/
coll.forEach((String s) -> {
System.out.println(s);
});
}
}
这两种遍历方式和第一种的区别:
增强for遍历 和 Lambda表达式遍历 都没办法对原集合进行删除操作
原因是因为Iterater迭代器对象中有remove()方法
package com.text;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
Iterator<String> it1 = coll.iterator();
while (it1.hasNext()) {
String str = it1.next();
if ("bbb".equals(str)) {
it1.remove();
} else {
System.out.println(str);
}
}
}
}