概述
Java提供了很多的数据结构,例如:数组、集合、Map表等等,迭代器Iterator就是用来帮助我们做集合遍历工作的,在遍历这些数组或集合时通常可以使用for循环或是Iterator迭代器,那么我们如何来选择呢?
1、for循环和迭代器的选择:
在集合无法使用for循环遍历的时候,可以考虑Iterator,迭代之后可以进行遍历。
List接口的实现类ArrayList是在内存中开辟几个连续的存储空间,这样的话,直接使用for循环就可以遍历整个集合的元素。
但是Map不可以,比如Map接口的实现类HashMap,因为这个类的对象中的元素的储存方式并不是顺序存储,或是底层通过HashMap实现的HashSet,其内部结构不是顺序存储的,本身也没有提供get(index),这样通过索引来获取元素的方法,自然不能通过for循环来遍历,只可以使用Iterator来遍历。
总结:
- 数组、List集合可以使用for循环也可以使用迭代器,但是建议使用for循环。
- Set集合、Map表只可以使用迭代器进行遍历。
2、迭代器的工作方式:
在取出元素之前先判断集合中有没有元素,如果有就把元素取出来,再继续判断,直到将元素全部取出。
Iterator接口的常用方法:
- hasNext():判断集合中还有没有可以被取出的元素,如果有返回true,没有返回false。(返回值是boolean)
- next():取出集合中的下一个元素。(返回值是E,集合中的下一个元素)
分析:当集合调用Iterator it = set.itreator();
创建一个迭代器以后,这段代码执行时,在集合的内部建立了一个指针(虽然Java中没有指针的概念,这里用指针描述更加便于理解)而指针的初始位置不是指向内存中的0位,而是-1位。
while(set.hasNext()){
System.out.println(set.next());
}
每次取出前用hasNext()
询问是否有下一个元素,如果有直接使用next()
方法将其取出,该指针便会移向下一位,如果下一位没有元素了,也就是说hasNext()
返回了false
,会结束遍历。
3、迭代器的转型:
如果不指定泛型,集合是可以存储任意类型的对象的,由于元素被存放进集合后全部被提升为Object类型,而在使用迭代器遍历时,会默认使用Object来接收元素,当需要子类特有方法时,就需要向下转型,此时进行向下转型就可能发生类型转换异常。
public static void main(String[] args){
//在不指定泛型的情况下可以添加任意类型的元素
Collection c = new ArrayList();
c.add("opq");
c.add(111);
Iterator it = coll.iterator();
while (it.hasNext()) {
// it.next()获取出来的对象数据类型为Object
//当需要使用子类对象特有方法时,需要向下转型,此时会报类型转换异常Integer无法转换为String
String str = (String) it.next();
}
}
4、增强for循环:
增强for循环是JDK5新推出的特性,增强for循环也称为新循环 for each,新循环不取代传统for循环的工作,它专门设计是用来遍历集合数组的。
增强for循环遍历集合会被编译器改为使用迭代器遍历,所以在遍历的过程中是不能通过集合的方法增删元素的。
增强for循环的底层实现是迭代器,相比迭代器而言除了语法简单其他的没有什么区别。
最后
以上就是和谐蜗牛为你收集整理的Java 遍历时如何选择for循环和Iterator的全部内容,希望文章能够帮你解决Java 遍历时如何选择for循环和Iterator所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复