您的位置:首页 > 编程语言 > Java开发

java--集合的迭代器

2016-04-15 15:08 495 查看
在使用迭代器遍历一个集合的时候,我们需要掌握一下的一些知识:

Iterator iterator():迭代器,集合的专用遍历方式

Object next():获取元素,并移动到下一个位置。

NoSuchElementException:没有这样的元素,因为你已经找到最后了。

boolean hasNext():如果仍有元素可以迭代,则返回 true。

需要注意的是他们的输入赋值方式。

导入的包为:

import java.util.ArrayList;

import java.util.Collection;

import java.util.Iterator;

我要讲的是一个

package shike;

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

public class hahha {
public static void main(String[] args){
Collection c= new ArrayList();
c.add("kaishi");
c.add("fendou");
c.add("weile");
c.add("meixiang");

Iterator it= c.iterator();//c的迭代器为it
Object obj=it.next(); //it读入数据
while(it.hasNext()){ //迭代器操作
String s=(String)it.next();//向下转型
System.out.println(s);
}
}
}


这样的输出为:



第一个没有输入,找到原因:Object obj=it.next(); //it读入数据

那么我们注释掉这行以后,就可以得到完整的输出:



我们也可以看看迭代器的使用图解:



迭代器的源码:

public interface Inteator {
boolean hasNext();
Object next();
}

public interface Iterable {
Iterator iterator();
}

public interface Collection extends Iterable {
Iterator iterator();
}

public interface List extends Collection {
Iterator iterator();
}

public class ArrayList implements List {
public Iterator iterator() {
return new Itr();
}

private class Itr implements Iterator {
public boolean hasNext() {}
public Object next(){}
}
}

Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();	 //new Itr();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}


集合的继承体系如下:



ArrayList存储字符串并遍历

*

* 我们按照正常的写法来写这个程序, 结果确出错了。

* 为什么呢?

* 因为我们开始存储的时候,存储了String和Integer两种类型的数据。

* 而在遍历的时候,我们把它们都当作String类型处理的,做了转换,所以就报错了。

* 但是呢,它在编译期间却没有告诉我们。

* 所以,我就觉得这个设计的不好。

* 回想一下,我们的数组

* String[] strArray = new String[3];

* strArray[0] = "hello";

* strArray[1] = "world";

* strArray[2] = 10;

* 集合也模仿着数组的这种做法,在创建对象的时候明确元素的数据类型。这样就不会在有问题了。

* 而这种技术被称为:泛型。

*

* 泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。

* 格式:

* <数据类型>

* 此处的数据类型只能是引用类型。

* 好处:

* A:把运行时期的问题提前到了编译期间

* B:避免了强制类型转换

* C:优化了程序设计,解决了黄色警告线

*/
public class GenericDemo {
public static void main(String[] args) {
// 创建
ArrayList<String> array = new ArrayList<String>();

// 添加元素
array.add("hello");
array.add("world");
array.add("java");
// array.add(new Integer(100));
//array.add(10); // JDK5以后的自动装箱
// 等价于:array.add(Integer.valueOf(10));

// 遍历
Iterator<String> it = array.iterator();
while (it.hasNext()) {
// ClassCastException
// String s = (String) it.next();
String s = it.next();
System.out.println(s);
}

// 看下面这个代码
// String[] strArray = new String[3];
// strArray[0] = "hello";
// strArray[1] = "world";
// strArray[2] = 10;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: