A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李东城 中级黑马   /  2013-2-7 03:23  /  1364 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

既然List是有序的,我们可以使用循环进行遍历,比如for循环,循环过程中也可以使用List本身的方法对元素进行操作,为什么还需要Iterator?什么还有一个更强大的ListIterator?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

2 个回复

倒序浏览
for ( : )这种循环是在JDK5以后才支持的。而这种循环对于集合类来说,会生成一个迭代对象Iterator,然后进行遍历的。在每次循环之前,它会检查集合类当前的长度是否发了变化,如果发生变化就会抛出如上的异常。对于ArrayList, 这段检查的代码是这样的(此段代码是写在AbstractList类的内部类Itr中):

为什么还要有一个更强大的ListIterator?因为可以更方便的操作ArrayList集合,它里边的方法都是针对有角标的集合的特有方法。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
一、Iterator是一个接口,强调松耦合。比如有一天list改成了set,你的for循环是不是就悲剧了~·
二、ListIterator看名字就知道是为ArrayList准备的迭代器,想想ArrayList的特点就清楚了。
三、关于速度的测试:
==================================
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
/**
* IteratorTest
* @author SageZk
*/
public class IteratorTest {
public static long testForloops(List<String> list) {
  long start = 0L, end = 0L;
  @SuppressWarnings("unused")
  String le = null;
  start = System.nanoTime();
  for (int i = list.size() - 1; i >= 0; --i) {
   le = list.get(i);
  }
  end = System.nanoTime();
  return end - start;
}
public static long testIterator(List<String> list) {
  long start = 0L, end = 0L;
  @SuppressWarnings("unused")
  String le = null;
  start = System.nanoTime();
  Iterator<String> it = list.iterator();
  while (it.hasNext()) {
   le = it.next();
  }
  end = System.nanoTime();
  return end - start;
}
public static void main(String[] args) {
  //测试列表长度
  final int LEN = 10000;
  //初始化测试用数据
  List<String> arraylist = new ArrayList<String>();
  List<String> linkedlist = new LinkedList<String>();
  for (int i = 0; i < LEN; ++i) {
   String s = Integer.toString(i, 2);
   arraylist.add(s);
   linkedlist.add(s);
  }
  //打印测试结果
  final String FORMAT = "%1$-16s%2$-16s%3$16d\n";
  System.out.println("List\t\tType\t\tTime(nanoseconds)");
  System.out.println("-------------------------------------------------");
  System.out.printf(FORMAT, "ArrayList", "for", testForloops(arraylist));
  System.out.printf(FORMAT, "ArrayList", "Iterator", testIterator(arraylist));
  System.out.printf(FORMAT, "LinkedList", "for", testForloops(linkedlist));
  System.out.printf(FORMAT, "LinkedList", "Iterator", testIterator(linkedlist));
}
}
=============================
以下是 3 组测试结果:

[code=BatchFile]List Type Time(nanoseconds)
-------------------------------------------------
ArrayList       for                      1189258
ArrayList       Iterator                 2365594
LinkedList      for                    152396254
LinkedList      Iterator                 2340801

List Type Time(nanoseconds)
-------------------------------------------------
ArrayList       for                      1235701
ArrayList       Iterator                 4249982
LinkedList      for                    149825606
LinkedList      Iterator                 2525531

List Type Time(nanoseconds)
-------------------------------------------------
ArrayList       for                      1198267
ArrayList       Iterator                 2584617
LinkedList      for                    150382451
LinkedList      Iterator                 2347994
[/code]

for循环用于ArrayList的遍历还是可以的,但为了更大方面的考虑建议直接使用Iterator接口实现。另,LinkendList本身查询就慢,用for就更挂了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马