看老大的代码需要取list里面每个元素的时候,都是
    Iterator it = list.iterator();
    while (it.hasNext()) {
        personnelID= (String) it.next();
    }这样比我直接写for(int i=0;i<list.size();i++){
       personnelId=(String)list.get(i);}
有什么优点吗?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【crowgns】截止到2008-07-22 16:29:52的历史汇总数据(不包括此帖):
    发帖的总数量:25                       发帖的总分数:1220                     每贴平均分数:48                       
    回帖的总数量:202                      得分贴总数量:92                       回帖的得分率:45%                      
    结贴的总数量:25                       结贴的总分数:1220                     
    无满意结贴数:2                        无满意结贴分:56                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:8.00  %               无满意结分率:4.59  %                  
    敬礼!
      

  2.   

    就因为我在c++论坛发了一个求助贴,结果现在每次发帖都说我有一个帖子没结贴让我去结,尽管那个贴我实际已经结了,这是bug吧...
      

  3.   

    itertor即枚举器,枚举器是Java在后台自动排序好,比纯粹的for循环要快,因为如果用 for循环,也需要将List中的对象依次取出,这样对内存的调用是随机的,不如Iterator。
     
      

  4.   

    真的!如果List为ArrayList时,这两种方式遍历差别就不大!如果是LinkedList,反而推荐使用for!
      

  5.   

    哦,原来如此,那foreach呢?效果是不是和普通的for循环一样啊···??
      

  6.   

    还是喜欢用for
    for(String str : list){
    }
      

  7.   

    就是arrayList,所以我可以继续我的for了?
      

  8.   


     好像不对吧?我觉得这两种方式各有各得好处,当你在循环内要使用索引的时候,for就比iterator好一些,否则iterator还要在声明一个变量,然后在递增。
      

  9.   

    你的方法依赖于具体实现,不是松耦合,
    比如以后你的代码改了,list不在是list接口了,而是set接口(没有get(i)方法),
    这时你的代码改动就大了,for里面全部要重写,而你老大的代码几乎不用任何修改,当然这也牺牲了部分性能
      

  10.   

    还是建议你使用iterator!
    原因,我说了,然后楼上也有兄弟补充了!
    有兴趣,你可以看看jvm相关的!
      

  11.   

    为什么不直接用iterator,省得编译器还要转一次,而且还向上不兼容(jdk1.5+才支持foreach)
      

  12.   


    这位仁兄你说的不对,做了个简单的测试如下:----------测试ArrayList-----------
    iterator操作:80ms
    get操作:40ms
    ----------测试LinkedList-----------
    iterator操作:110ms
    get操作:140ms结论:ArrayList随机访问更快,LinkedList顺序访问更快
      

  13.   

    一个完整的遍历速度测试: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                 2340801List Type Time(nanoseconds)
    -------------------------------------------------
    ArrayList       for                      1235701
    ArrayList       Iterator                 4249982
    LinkedList      for                    149825606
    LinkedList      Iterator                 2525531List Type Time(nanoseconds)
    -------------------------------------------------
    ArrayList       for                      1198267
    ArrayList       Iterator                 2584617
    LinkedList      for                    150382451
    LinkedList      Iterator                 2347994
    [/code]
      

  14.   

    使用 Iterator 的好处在于可以使用相同方式去遍历集合(List 是有序集合)中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口)。
    比如楼主例子中,如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 TreeSet 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整。
      

  15.   

    我都不知道system下有个.nanoTime方法,,惭愧,
    试了下,
    管·
      

  16.   

    java 聚集本身设计了迭代子,为什么还有自己去用for循环遍历呢,设计模式里面已经很清楚的说了迭代子模式的优点了啊。
      

  17.   

    用iterator迭代属于面向对象编程。更加符合JAVA本身。另外学过数据结构的都应该了解LinkedList,是以链表为基础实现,链表便于顺序访问。在操作的时候,查快改慢。
    ArrayList,顾名思义,以数组方式实现,便与随机访问,查慢改快。foreach内部实现原理也是迭代,但不方便单个数据的修改。------------
    c,c++,数据结构没及格学生留。
      

  18.   

    上面说反了
    应该是:
    LinkedList,是以链表为基础实现,链表便于顺序访问。在操作的时候,查慢改快。ArrayList,顾名思义,以数组方式实现,便与随机访问, 查快改慢。 
      

  19.   

    上面两个都不怎么样,应该使用下面的形式:
     List<String> arraylist = new ArrayList<String>();
     for (String str:arraylist) {
        System.out.println(str);
     }这做到了最好的封装性.
      

  20.   

    看来for还是快一些,不过Iterator以这但牺牲来换取灵活性也是值得的。如果真是那么看重性能的,我们也不会使用抽象数据结构了。
      

  21.   

    iterator遍历时,还对当前拿到的东西进行锁定。
    如:.....
    Collection c = new Hashset();
    c.add(new Name("fff1", "llll"));
    c.add(new Name("fff1", "llll"));
    c.add(new Name("fff1", "llll"));for(Iterator<Name> i=c.iterator(); i.hasNext(); ) {
    Name name = i.next();
    if(name.getFirstName().length() < 3) {
    i.remove();
    /*
    而不能是
    c.remove(name);
    只能由Iterator来调用对象,而不能是其他。
    */
    }
    }
      

  22.   

    最好的做法
    List <String> list = new ArrayList <String>(); 
    for (String s:list) { 
        System.out.println(s); 
    } Iterator it = list.iterator();  这样的用法一般在jdk 1.5以前使用。
      

  23.   

    foreach编译后其实就是用Iterator实现的,好在哪里啊?
    难道就是少了两行代码
      

  24.   

    我搞清楚了,现在在gwt做界面,只支持jdk1.4
      

  25.   

    学习来了~ArrayList用for
    LinkedList用Iterator还有System.nanoTime();
      

  26.   

    还有就是那个你的for循环里有list.size(),你每循环依次就要调用一下方法,这明显消耗性能.
      

  27.   


    LinkedList当数据很多的时候你用get试试看,鄙视
      

  28.   

    linklist增删时只需将n的前后节点相连,把n置为null即可,而arrayList增删时在先找到m元素将它删除,还要向前移动n-m-1个元素。
    但是当linklist元素很多又没有索引的情况下使用linklist是不合理的。因为调用linklist.remove(Object)是很慢的,最坏的在m-1次。如果在有索引可用的情况下使用linklist.remove(int):它是先判断要删除的索引下标在链表的前半、后半部分,如果在前半部就从链表的前面开始查找,在后半部分则从后面开始查找。