概述
集合元素的遍历操作,使用迭代器Iterator接口
1.内部的方法:hasNext() 和 next()
Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素
2.集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合中的第一个元素之前。
3. GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元 素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。类似于“公 交车上的售票员”、“火车上的乘务员”、“空姐”。
3.内部定义了remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()
4.Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所 有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了 Iterator接口的对象。
Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合
集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合 的第一个元素之前
**
迭代器执行原理
**
public class IteratorTest {
@Test
public void test1(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("tom"));
coll.add(false);
Iterator iterator = coll.iterator();
/* //方式一:
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());*/
//报异常NoSuchElementException
// System.out.println(iterator.next());
//方式二:不推荐
/*for (int i = 0; i <coll.size() ; i++) {
System.out.println(iterator.next());
}*/
//方式三:推荐
//迭代器执行原理
//hasNext():判断是否还有下一个元素,指针会指向下一个
while (iterator.hasNext()){
//next():1.指针下移 2.将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
}
@Test
public void test2(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("tom"));
coll.add(false);
//错误方式一:while中的指针会指向下一下,但是输出语句中的next()会出现跳着循环的现象
/* Iterator iterator = coll.iterator();
while ((iterator.next()) != null){
System.out.println(iterator.next());
}*/
//错误方式二:集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合中的第一个元素之前。
while (coll.iterator().hasNext()){
System.out.println(coll.iterator().next());
}
}
//测试Iterator中的remove()
@Test
public void test3(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("tom"));
coll.add(false);
//删除集合中的"Tom"
Iterator iterator = coll.iterator();
while (iterator.hasNext()){
//
iterator.remove();
//如果还未调用next()或在上一次调用next()方法之后已经调用了remove方法,
//再调用remove都会报IllegalStateException.
Object obj = iterator.next();
if ("tom".equals(obj)){
iterator.remove();
}
}
//遍历集合
iterator = coll.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
## 使用增强for循环
jdk5.0 新增了foreach循环,用于遍历数组,集合。
源码中,增强for循环的底层也是用迭代器来实现的,不过更加简单易懂。
public class ForTest {
@Test
public void test1(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry", 20));
coll.add(new String("tom"));
coll.add(false);
//for(集合元素的类型 局部变量 : 集合对象 )
//内部仍然调用了
for (Object obj : coll){
System.out.println(obj);
}
}
@Test
public void test2(){
int[] arr = new int[]{1,2,3,4,5,6};
//for(数组元素的类型 局部变量 : 集合对象)
for (int i : arr){
System.out.println(i);
}
}
@Test
public void test3(){
String[] arr = new String[]{"MM","MM","MM"};
//方式一:普通for赋值
/*
for (int i = 0; i < arr.length; i++) {
arr[i] = "GG";
}*/
//方式二:增强for循环,把值赋给了s,并没有修改到数组
for (String s : arr){
s = "GG";
}
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]);
}
}
}
## 前两种循环与普通for循环进行对比
@Test
public void test3(){
ArrayList list = new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
//方式一:Iterater迭代器方式
Iterator iterator =list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("**************");
//方式二:增强for循环
for (Object obj : list){
System.out.println(obj);
}
System.out.println("***************");
//方式三:普通for循环
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));
}
}
最后
以上就是悲凉微笑为你收集整理的使用迭代器,增强for循环进行集合元素的遍历操作与普通循环进行对比的全部内容,希望文章能够帮你解决使用迭代器,增强for循环进行集合元素的遍历操作与普通循环进行对比所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复