在JAVA util包里,有一个接口叫Iterator叫迭代器,它是用来遍历集合的。
JAVA提供了很多个集合,它们在存储元素时,采用存储的方式不同,我们要取出这些集合中的元素,可以通过一种通用的获取方式来完成。
Collection集合元素的通用获取方式:
先由集合对象创建一个迭代器,
迭代器在取元素之前先判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取,一直将所有元素全部取出。这种取出的方式叫迭代。
集合中把这种迭代的方法,描述在Iterator接口中,接口的方法有:
1. hasNext(); 返回boolean
2. next();取出下一个元素,指针往后偏移一位
3. remove(); 从迭代器指向的Collection中移除迭代器返回的最后一个元素
迭代器Iterator是一个接口, 它的实现类就有Collection,
Collection有一个方法叫iterator()
ArrayList类重写了iterator()方法,并返回Iterator接口的实现类的对象
Collection coll = new ArrayList(); //多态
coll.add("ab");
coll.add("bc");
coll.add("www");
//创建Iterator实现类的对象
Iterator it = coll.iterator();
//进行迭代
while(it.hasNext()){
System.out.println(it.next());
}
Iterator的通用之处在于,不管是哪种类型的集合,都可以通用
Collection coll = new HashSet();
....
Iterator it = coll.iterator();
二、集合存储转型的问题
集合可以存储任意类型的对象
Collection coll = new ArrayList(); 不指定泛型,集合可以混合存放不同的类型数据
coll.add(1);
coll.add("abc");
coll.add(true);
//迭代器获取
Iterator it = coll.iterator(); //迭代器同样不能指定泛型,Iterator>
while(it.hasNext()){
Object obj = it.next(); //此处取出的是Object对象
System.out.println(obj); //因为此处不能确定元素对象到底属于哪一种类型,只能用父类来接收。
}
所以迭代器Iterator也应和Collection一样,加上来限定类型
三、泛型
Collection coll = new ArrayList(); //不加泛型,可以任意数据混存
Collection coll = new ArrayList(); //加泛型,限定集合存储数据的类型
Collection coll = new ArrayList();
coll.add("abc");
coll.add(1);
Iterator it = coll.iterator();
while(it.hasNext()){
String s = (String)it.next();
System.out.println(s.length()); //此处强转会出错,因为Integer 1转string时,会报classCastException
}
所以为了安全问题的考虑,JAVA加入了泛型机制,限定集合中的元素类型。
三、增强for
for(临时变量:集合){
}
Collection coll = new ArrayList();
coll.add("www");
coll.add("baidu");
for(String str : coll){
System.out.println(str.length);
}
四、使用泛型的好处
1. 更加安全,避免数据类型转换时ClassCastException,将错误从运行时期,提前到编译时期
2. 避免了类型强转的麻烦,减少了代码量
3. 带来了增强for的使用
五、泛型的通配符
文件系统中*为通配符, 如*.java表示所有后缀名为java的文件
泛型也有通配符
ArrayList arr = new ArrayList();
HashSet set = new HashSet();
arr.add("123");
arr.add("456");
set.add(789);
set.add(890);
//定义一个方法,可以同时迭代上面两个集合,参数如何定义?既不能单独写ArrayList,也不能单独写HashSet,只能写父类接口Collection,但给Collection加泛型时,到底加ArrayList还是HashSet呢,这时通配符就出现了Collection>
public static void iterator(Collection> coll){
Iterator> it = coll.iterator();
while(it.hasNext()){
it.next(); //这里得到的结果是Object类型
}
}
通配符的好处就是通配所有类型,弊端就是类型已经变得未知了。