网站中的给我留言怎么做/百度推广怎么提高关键词排名
一、Iterator的好处--面向接口编程
更广泛的使用范围。
Iterator迭代器针对Collection设计,但get(int index)、remove(int index)等一类的方法并不是Collection接口的标准,也就是说,对ArrayList,即List的实现,你能使用这些方法,但对于Collection的其他实现,如Set等,你可能就必须使用Iterator了。
更好的异常控制。
Iterator迭代器允许调用者在在迭代期间对迭代器所指向的Collection进行remove等操作,而对于这种情况,一般的for(int i = 0; i < Collection.size(); i++)遍历方式可能就会出现IndexOutOfBoundsException。
更佳的性能。
对于数组形式的Collection,例如问题中的ArrayList,两种遍历方式可认为性能几乎一致;但对于链表形式的Collection,例如同样是List实现的LinkedList,一般的for(int i = 0; i < Collection.size(); i++)遍历方式可能是噩梦,因为在for loop的内部,执行get(int index)、remove(int index)等一类的方法时需要再次进行部分遍历。即Iterator会从一个节点直接通过next指针获得下一个节点,遍历时间复杂度始终是O(n),而一般的for loop的时间复杂度在链表的情况下会上升至O(n^2),n很大时,性能消耗非常恐怖。
另外补充两点:
对于for循环,我们还有一种叫做所谓for each的写法,C#中就是for each,Java中是for(Object o : Collection os),这种写法不仅仅是个语法糖,使代码更漂亮、更简洁,更重要的是,for each实际上就是使用的迭代器,因此,code时始终使用foreach代替一般的for loop就对了!
//以三种方式遍历集合List
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
System.out.println("----------方式1-----------");
//第一种方式,普通for循环
for(int i = 0; i < list.size(); i++)
{
System.out.println(list.get(i));
}
System.out.println("----------方式2-----------");
//第二种方式,使用迭代器
for(Iterator iter = list.iterator(); iter.hasNext();)
{
System.out.println(iter.next());
}
System.out.println("----------方式3-----------");
//第三种方式,使用增强型的for循环
for(String str: list)
{
System.out.println(str);
}
For-Each循环是JDK5.0的新特性(其他新特性比如泛型、自动装箱等)。当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用For-Each循环,因为它丢失了下标信息。
code时,遵循够用原则,参数传递等尽量面向接口,而不是具体的实现类,这有利于代码的兼容以及后续升级。例如方法:
function(ArrayList os);
如果在function中用不到os的ArrayList独有的特性,List已经够用,则写成下面的形式更好,这样调用者就更轻松了,他可以提供ArrayList之外的数据类型,如LinkedList:
function(List os);
同理,再进一步,甚至可以写成如下形式:
function(Collection os);
二、例子
import java.util.*;
public class Muster {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
Iterator it = list.iterator();
while(it.hasNext()){
String str = (String) it.next();
System.out.println(str);
}
}
}
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。