Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > while vs for


Автор: Tony 11.9.2006, 15:32
Приветик всем!
Вопрос может глупый,но интересно мнение у4астников форума.

Код

                List <String>list=new ArrayList<String>();
        
        for(Iterator<String> it=list.iterator();it.hasNext();){
            String string=it.next();            
        }
        
        Iterator <String>it=list.iterator();
        while(it.hasNext()){
            String string=it.next();
        }

Какой из циклов(while,for) будет бысстрей работать с коллекцией? Слышел 4то for.

Автор: y3u 11.9.2006, 16:39
по идее (могу ошибаться) никакой разницы, кроме как что один цикл с т.н. предусловием, а второй с постусловием. В случае с for область видимости переменной уже, поэтому меньше верятности случайно сделать реюз переменной it, а значит и рефакторить проще...

Автор: chief39 11.9.2006, 16:59
Дык придумали же специально в пятой: 

Код

ArrayList<String> strL = new ArrayList<String>();
        
        for(String str : strL){
            System.out.println(str);
        }

smile

Как раз для перебора самое то smile

Автор: Tony 11.9.2006, 17:05
chief39 Читай внимателно вопрос topica !!! forEach не рассматривается.

Автор: batigoal 11.9.2006, 17:07
По идее, разницы в скорости быть не должно. Попробуй провести тест.

Автор: LSD 11.9.2006, 17:40
Цитата(Tony @  11.9.2006,  16:32 Найти цитируемый пост)
Какой из циклов(while,for) будет бысстрей работать с коллекцией? Слышел 4то for.

Абсолютно одинаково.
Возьмем такой класс:
Код
import java.util.*;

public class Test
{
  public void iter1()
  {
    List <String>list=new ArrayList<String>();
        
    for(Iterator<String> it=list.iterator();it.hasNext();){
        String string=it.next();            
    }
  }

  public void iter2()
  {
    List <String>list=new ArrayList<String>();
        
    Iterator <String>it=list.iterator();
    while(it.hasNext()){
        String string=it.next();
    }
  }
}

и дизассемблируем его:
Код
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public void iter1();
  Code:
   0:   new     #2; //class java/util/ArrayList
   3:   dup
   4:   invokespecial   #3; //Method java/util/ArrayList."<init>":()V
   7:   astore_1
   8:   aload_1
   9:   invokeinterface #4,  1; //InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
   14:  astore_2
   15:  aload_2
   16:  invokeinterface #5,  1; //InterfaceMethod java/util/Iterator.hasNext:()Z
   21:  ifeq    37
   24:  aload_2
   25:  invokeinterface #6,  1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
   30:  checkcast       #7; //class java/lang/String
   33:  astore_3
   34:  goto    15
   37:  return

public void iter2();
  Code:
   0:   new     #2; //class java/util/ArrayList
   3:   dup
   4:   invokespecial   #3; //Method java/util/ArrayList."<init>":()V
   7:   astore_1
   8:   aload_1
   9:   invokeinterface #4,  1; //InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
   14:  astore_2
   15:  aload_2
   16:  invokeinterface #5,  1; //InterfaceMethod java/util/Iterator.hasNext:()Z
   21:  ifeq    37
   24:  aload_2
   25:  invokeinterface #6,  1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
   30:  checkcast       #7; //class java/lang/String
   33:  astore_3
   34:  goto    15
   37:  return

}

Как видишь байткод одинаковый.

Автор: Tony 11.9.2006, 18:03
Вопрос снят.Всем спасибо за у4астие.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)