大家好,烦人的我又来了,小白今天已经更了两两篇博客了呀,但是感觉很充实,那么……开始这篇的内容吧
关于迭代,我先举个例子,大家应该都很喜欢玩角色扮演的游戏,那么现在该干什么呢……?
Java是面向对象的设计思想,第一步当然是设计类了,现在我设计一个英雄类 私有的数据是英雄名字、英雄等级和血量:
public class Hero {
private String name;
private int level;
private int blood;
public Hero(String name,int level,int blood) {
this.name = name;
this.level = level;
this.blood = blood;
}
// @Override
public String toString() {
return String.format("名称:%s 等级:%d 血量:%d"
, this.name, this.level, this.blood);
}
}
还是为了设计方便,我还是重写了一次toString方法。
接下来设计一个list对象来存储英雄,之后设计一个方法来遍历list:
import java.util.*;
public class OperateInterable {
public static void main(String [] args) {
List <Hero> list = new ArrayList();
Hero [] h = {
new Hero("葛小伦",50,1000),
new Hero("蔷薇",60,1100),
new Hero("蕾娜",66,1400)
};
for(int i = 0;i < h.length;i++) {
list.add(h[i]);
}
forEach(list);
}
static void forEach(List <Hero> list) {
for(Hero h : list) {
System.out.println(h.toString());
}
}
}
输出的结果大家应该也想得到,我就不详细解释了。
但是
(1)假如我现在想遍历一个set对象,那么需要对forEach方法进行重载
(2)要是想遍历一个queue对象,还需要进行重载
具体的代码如下:
static void forEach(Set <Hero> set) {
for(Hero h : set) {
System.out.println(h.toString());
}
}
static void forEach(Queue <Hero> queue) {
for(Hero h : queue) {
System.out.println(h.toString());
}
}
但是,作为一个程序员,你能忍受重复这样的事情发生吗?反正我是忍不了。
那么,我们就要找到一个相对简单的方法,不管输入的对象是什么样的,都能遍历
这就到了iterable和iterator两个接口了。
list、set、queue都是继承接口collection ,JDK5之前collection类里面就有了iterator的定义,
那么我们使用iterator来写一段遍历的通用方法:
static void forEach(Collection <Hero> collection) {
Iterator <Hero> iterator = collection.iterator();
Hero hero;
while(iterator.hasNext()) {
hero = iterator.next();
System.out.println(hero.toString());
}
}
这里面有几个需要强调的点:
1、根据多态的设计思路,设计传入的是collection类的可迭代(iterator)的类
2、上面说了,collection里面有iterator方法,所以创建iterator对象的时候直接调用
3、iterator.hasnext()方法是用来检查传 进来的对象是不是还有下一个对象,当有的时候返回true,要是没有下一个的话,就返回false
4、循环里面使用iterator.next()得到这个对象
在这里面我就偷点懒,直接使用泛型了,懒得使用对象的扮演(cast)了
那么调试一下:
public static void main(String [] args) {
List <Hero> list = new ArrayList<>();
Queue <Hero> queue = new ArrayDeque<>();
Set <Hero> set = new HashSet<>();
Hero [] h = {
new Hero("葛小伦",50,1000),
new Hero("蔷薇",60,1100),
new Hero("蕾娜",66,1400)
};
for(int i = 0;i < h.length;i++) {
list.add(h[i]);
set.add(h[i]);
queue.add(h[i]);
}
forEach(list); System.out.println();
forEach(queue); System.out.println();
forEach(set);
}
执行结果如下:
三种类型的对象都能进行输出,但是顺序是不太一样的,这个就和三种类型内部存储的方式有关了,至于是为什么,度娘找吧,我也不太清楚。
好了,对于iterator的理解就谈到这了,今天更了两篇博客,真的好开心呐,我会继续努力的,引用我同学的一句话:何为人才,不断学习,不断进步,方成人才。(不知道原话还不是这样的……)
大家,要为了自己美好的明天努力呀。