了解迭代器(hasNext(),next()和 其中的强制类型转换)

结合API文档学习:常用 hasNext() 和 next()方法 。

其实还有一种List特有的获取迭代器 的 方法 : ListIterator 。

ListIterator 包括  :  (1)add()方法:给List集合添加元素,不出现并行修改异常。 

                                 (2)hasNext()方法 : 检验后面还有没有元素。 从前往后查找。

                                 (3)next()方法 :获取下一个元素 。

                                 (4)hasPrevious()方法 :检验前一个是否有元素。从后往前查找。

                                 (5)previous()方法 : 获取前一个元素 。

ListIterator主要使用 :add(),hasNext(),next()。

因为 使用 hasPrevious()方法和previous()这两种方法的使用前提是 必须是在进行完 正向迭代 ,也就是 使用完 hasNext 和next 才能使用 hasPrevious 和 previous 。从开始迭代到最后(next和hasPrevious),然后再从最后迭代到开始(previous和hasPrevious)。开发中 从后往前的迭代意义不大。

范例代码如下:

import java.util.ArrayList;

import java.util.Collection;
import java.util.Iterator;


public class Main {


public static void main(String[] args) {
//迭代:就是 遍历 。 

//实例1 : 
Collection c = new ArrayList(); 
//往 集合中添加 元素 ; 
c.add("a") ; 
c.add("b") ;
c.add("c") ; 
c.add("d") ; 
//获取迭代器,先获取迭代器才能使用 属于迭代器的 方法 。
Iterator it = c.iterator() ;
//hasNext() : 检验集合 是否为空的 , 不为空 返回 true,如果为空,返回false 。
while(it.hasNext()){
System.out.println(it.next()); // next()是用来 获得 迭代到的 元素的数值。
}
//这里解释一下: String 也是 引用数据类型。 所以上面的a,b,c,d都没有报错。 
System.out.println("           ");

//实例2 : 
Collection c1 = new ArrayList(); 
c1.add(new Student("张三",20)); 
c1.add(new Student("李四",21)); 
c1.add(new Student("王五",22)); 
c1.add(new Student("赵六",23)); 
Iterator it1 = c1.iterator() ; 
while(it1.hasNext()){
//System.out.println(it1.next());
/*
结果:toString() 格式的 输出结果: 在Student类中要覆写toString方法。 
Student [name=张三, age=20]
                         Student [name=李四, age=21]
                         Student [name=王五, age=22]
                         Student [name=赵六, age=23]
   */

//如果我想 看到Student 的 名字和年龄 ,就要用到getname和getage两个方法,但是 上级不能直接调用下级的方法,所以这里涉及到了向下转型。 
//c1.add(new Student("王五",20));    第一步:Object s = new Student("王五",20);  第二步:存进集合中。

Student st = (Student)it1.next();

//存在集合中的元素类型为 Object 类对象 ,变成Student类对象,才能调用Student类中的 getName() 和 getAge()方法。Object类 为 Student类的 父类 , 父类不能直接调用子类中的方法 。 

//it1.next() 迭代出的元素 与 c1集合中存储的 元素 是一样的。所以将 it1.next()强制转换成 存入 集合之前的 类型 Student 。

System.out.println(st.getName()+"..."+st.getAge());
/*

使用getName 和  getAge 输出的方式: (其中涉及 强制类型转换)

张三...20
李四...21
王五...22
赵六...23*/

//remove()方法 是 移除迭代器返回的最后一个元素。
}
}


}


总结小知识点: 

没看源码的理解:next()和 hasNext()是相关联的, 一个计数器 number , 用一次 next() number就++,然后hasNext()中 在 比较 number和size(集合长度)的大小。(看源码,方法Itr中重写的 next,hasNext,remove三个方法)

看完源码之后的理解:hasNext()方法底层有一个couse的变量,它是用来记录位置的,调用一次next(),couse就自增1,然后couse与size比较,如果小于size就说明有元素。


* 注意:打印引用数据类型(对象),系统默认调用了toString()方法 。 在escplice中用 Ctril+1 点击println()方法,进去之后,Ctril+1 点击 valueOf。

源码如下:

public static String valueOf(Object obj) {

        return (obj == null) ? "null" : obj.toString();
    }

猜你喜欢

转载自blog.csdn.net/Ameir_yang/article/details/80845489
今日推荐