2013-09-02 8 views
1

foreach 루프 내에서 LinkedList의 동작에 대해 확신 할 수 없습니다. 예컨대 :LinkedList가있는 foreach 루프는 어떻게 작동합니까?

LinkedList<Apple> apples = new LinkedList<Apple>(); 

public Apple apple(String colour) { 
    for (Apple apple : apples) { 
     if (apple.getColour().equals(colour)) { 
      dosomething(); 
      return apple; 
     } 
    } 
    return null; 
} 

되지 않은 특정 순서로 목록에 걸쳐 많은 빨간 사과가 상상해보십시오. 그것은 다음과 같이 호출 될 때 :

apple("Red"); 

은 .. 그 첫 번째 빨간 사과 또는 마지막을 반환? 그렇지 않다면 정확히 어떻게 행동할까요?

답변

5

향상된 대 - 루프 종료까지리스트의 처음부터 예정 just like an iterator 동작. 귀하의 조건과 일치하는 첫 번째 요소에서 작동합니다.

Iterable의 서브 타입 인 것도 사실이다; 즉, Iterator을 생성 할 수있는 모든 것입니다. 따라서 Collection 클래스가 적용됩니다.

삽화 : 향상된-용 커버 아래 이렇게되어

for(Iterator<Apple> iterator = apples.iterator(); iterator.hasNext();) { 
    Apple apple = iterator.next(); 
    if(apple.getColour().equals(colour)) { 
     dosomething(); 
     return apple; 
    } 
} 
+0

당신은 목록에서 첫 번째 빨간 사과가 반환되고 방법은 그 poit에서 정지 의미합니까? – dhssa

+0

예. 당신이'return'을했기 때문에, iterator가 계속할 수있는 방법이 없다. (이것은 당신의 작업의 현재 실행의 종료이거나 "갑작스럽게 완료한다"). – Makoto

1

LinkedList<E> 정의 된 순서와 컨테이너 : 반복의 순서는 항목이 추가 된 순서에 대응 명부. for 루프가 요청 된 색상의 사과를 찾 자마자 종료되므로 첫 번째 빨간 사과가 반환됩니다. 물론 목록에 빨간색 사과가 없으면 null이 반환됩니다.

동일리스트의 다른 종류 (예를 들어, 어레이리스트)에 대해 사실이다. 그러나 다른 컨테이너는 다르게 동작 할 수 있습니다. 예를 들어 TreeSet<E>은 삽입 순서와 다른 방식으로 요소를 정렬합니다. HashSet<E>은 임의의 순서로 요소를 반환합니다. 각 루프에 대한

1

는 이상 반복되는 컬렉션의 반복자를 취득 할 수있는의 Iterable 인터페이스의 반복자 방법을 사용합니다. http://docs.oracle.com/javase/6/docs/api/java/util/AbstractSequentialList.html#iterator()

그것의 문서 상태 :

이 목록의 요소의 반복자를 돌려줍니다 당신이 LinkedList의를위한 JavaDoc를 보면 당신은 그 반복자() 메소드가 아니고 AbstractSequentialList 클래스에서 상속되는 것을 볼 수 있습니다 (정확하게 시퀀스에 있음).

그래서 그래, 당신은 첫 번째 빨간 사과를 얻을 것이다.