Java 'for each' 루프는 어떻게 작동하나요?
고려하세요:
List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
System.out.println(item);
}
for구문을 사용하지 않고 동등한
for` 루프는 어떤 모습일까요?
1437
20
루프에서
i.remove();
를 사용하거나 어떤 방식으로든 실제 이터레이터에 액세스해야 하는 경우, 실제 이터레이터는 단지 추론될 뿐이므로for ( : )
관용구를 사용할 수 없다는 점에 유의하세요.데니스 부에노가 언급했듯이, 이 코드는
Iterable
인터페이스를 구현하는 모든 객체에서 작동합니다.또한
for (:)
관용구의 오른쪽이Iterable
객체가 아닌array
인 경우 내부 코드에서는 int 인덱스 카운터를 사용하고 대신array.length
를 확인합니다. Java 언어 사양]2을 참조하세요.이는 본질적으로 같은
따라서 전체 요약: < br/>; [\ [nsayer]] [1] 다음은 긴 형태의 무슨일인거죠:
>. 대한 (Iterator< String>; i = 섬리스트리트레이터 (); 이스마스네스트 (); ) { >. 구체화하십시오 항목설명프로세서 = 이네스네스트 (); >. 시스템지우트리프린틀린 (item). >. } >. >. 참고로 사용해야 할 경우 >. i.레모프 (); in your 루프 또는 액세스 >. 실제 반복자가 어떤 방법으로 >. 위해 사용할 수 없습니다 (: 관용구, 이후) >. 실제 반복자가 불과하다 >. 유추.
[2] [\ [데니스 Bueno]]
>. # 39 에 의해 함축된 it& nsayer& # 39 라고 하지만, s >. # 39 에 달하는 it& 확인하면서 OP& # 39, s (.) >. 구문, someList" " 경우에는 작동합니다. 는 >. 구현하는 것도 >. it doesn& 자바드란g. 구티에레이블 # 39 없다. >. 수, 또는 일부 수집 목록 >. 제바스티우스 심지어 자신의 유형, >. 따라서 이 함께 사용할 수 있습니다. >. 구문.
[1]: # 85206 https://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work/85206 [2]: # 85242 https://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work/85242
또 이 '포리치' 루프, jave 5 (일명 & 크로트 크로트 loop& 향상,,,) 는 avamer 사용하는 it& 3 - ['제바스티우스트레이터'] # 39 의 통사 설탕 한 것. 이에 따라 각 요소에 읽을 때 하나씩 순서대로 a '와' 포리치 사탄들 반복자가 통해 항상 있기 때문에 더 편리하고 간결하게.
포리치
반복자가
'직접' 반복자가 충족되었으며 사용해야 하는 경우가 있습니다. 예를 들어, 시도중입니다 요소를 삭제하시겠습니까 사용하는 동안 '포리치' 가 (윌?) '' 콘스해류모디피카시오네스세페시옹 됩니다.
'포리치' 는 ':' vs. 기본 변경분
즉, 유일한 차이점은 '에 대해 실질적인' 와 '포리치' 의 경우, 당신은 색인가능 객체에는 액세스할 수 없는 색인입니다. 예를 들어 '기본' 을 때 루프 필요합니다.
직접 만들 수도 있지만, 별도의 인덱스화할 변수 int 포리치 '와'
이후 갖추고 있지 않는 것이 좋습니다, 변수 범위를 '는 단순히 "에 대한 기본적인 루프 표준 및 예상 형식과 엔드입니다 览侩 荤례.
'포리치' 는 ':' vs. Performance< /H2>;
훨씬 빠르게 '는 액세스하면 컬렉션, a' 포리치 '기본' 에 비해 loop& # 39 의 어레이입니다 액세스입니다. 함께 그러나 dell. 액세스하면 어레이에는 프리미티브 및 래퍼 어레이에는 액세스만 indexe 통해 가장 빠르게 얻을 수 있습니다.
반복자가 및 인덱스를 위한 기본적인 차이점은 int 어레이에는 액세스 타이밍
Int '또는' 정수 '보다' iterator) 가 인덱스가 23-40 액세스하면 배열입니다. 다음은 이 게시물 하단에 있는 자금을 출력입니다 테스트 클래스가 있는 숫자는 100 요소점 프리미티브 int 어레이입니다 (a 는 b 를 반복자가 인덱스화할):
난 또 이 경우, 인덱스 '정수' 어레이입니다 실행했음 뿐 여전히 분명한 승리자가 되었다는 25 ~ 18 퍼센트 를 가속화합니다.
Iterator 의 컬렉션, 기차보다 인덱스화합니다
그러나 '정수' 의 '목록' 에 대한 선택해제합니다 iterator 는 없다. 그냥 테스트 클래스 int 어레이입니다 변경하십시오 에서 다음과 같이 사용된다.
저회가 필요한 변화를 테스트 기능을 ('int []' 을 'list<, integer>', '길이' 을 ', 크기 ()' 등):
39 한 테스트 they&, re 아찔했어 avamer 갖추고 있지만, 컬렉션, 반복자가 경기다.
이 post 는 2 일 기준으로 스택 오버플로입니다 답변 I wrote:
22540191* https://stackoverflow.com/questions/22540025/should-i-use-an-iterator-or-a-forloop-to-iterate/22540191
일부 추가 정보: , https://stackoverflow.com/questions/2113216/which-is-more-efficient-a-for-each-loop-or-an-iterator
전체 테스트 클래스
이 질문 를 읽은 후 내가 만든 이 걸리는 시간은 두 가지 비교 할 수 있습니다 클래스용 스택할 오버플로입니다:
[6]: # 22110517 https://stackoverflow.com/questions/22110482/uses-and-syntax-for-for-each-loop-in-java/22110517
다음은 solaris. 지식이 없는 답을 jave iterator. 정확히까지 교육을 위한 유용한 것은 적다.
프로그래밍 코드를 작성할 때 우리는 종종 보이는 다음과 같습니다.
이 구문은 일반적인 패턴을 포리치 를 사용하면 보다 자연스럽고 구조상 소음이 적은 쓸 수 없다.
또한 이 구문은 유효함 객체에는 열거합니다 또는 세트 등 아니라 어떤 Java 를 지원하지 않는 어레이입니다 인덱스화를 못하며창조된 구현하십시오 이트레이블 인터페이스입니다.
Java의 for-each 루프는 기본 반복자 메커니즘을 사용합니다. 따라서 다음과 동일합니다:
자바 가상 머신 (jvm) 에 8 이 기능을 사용할 수 있습니다.
출력입니다
39 에 의해 함축된 it& nsayer& # 39 라고 하지만, s, s # 39 에 달하는 it& 확인하면서 OP& # 39 (.) 구문, someList" " 경우에는 작동합니다. it doesn& # 39 는 구현하는 anything 자바드란g. 구티에레이블 바뀌엇어요 제바스티우스 수집, 또는 일부 수 없다. 심지어 자신의 유형, 따라서 이 문법을 사용할 수 있습니다.
[JLS] [1] 각 루프 두 가지 형식이 정의되어 있을 수 있습니다.
List< String>; 섬리스트 = new ArrayList< String> ();;; 섬리스트리아다 (Apple" ";). 섬리스트리아다 (Ball" ";). 대한 (구체화하십시오 항목: 섬리스트) { 시스템지우트리프린틀린 (item). }
// 공감대를 형성하고 있다.
대한 (Iterator< String>; 스트린기트레이터 = 섬리스트리트레이터 (); 스트린기트레이터스하스네스트 (); ) { 구체화하십시오 항목설명프로세서 = 스트린기트레이터스네스트 (); 시스템지우트리프린틀린 (item). }
문자열 [], [2] = new 문자열이어야 소미어리 [0] = " 소미어리 Apple";; [1] = " 소미어리 Ball";;
대한 (구체화하십시오 item2: 소미어리) { 시스템지우트리프린틀린 (item2); }
// 공감대를 형성하고 있다. 대한 (int i = 0; 내가 <. 소메어리드렌크스. i++) { 구체화하십시오 item2 = 소미어리 [i]; 시스템지우트리프린틀린 (item2); }
일반적으로 스트리밍합니다 jave 8 은 수행하는 것입니다. 솔리드로 사용할 수 있습니다.
[1]: http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html # jls-14.14.2
포리치 는 루프 구문은 다음과 같습니다.
예:
출력:
경고: 액세스하려면 어레이입니다 요소 중 포리치 루프 저들이요 초기화하지 수는 없습니다 '오리지널' 을 사용하여 루프 iqn.
경고: 다른 유형의 어레이에는 객체에는 일치시킵니다 합니다.
'오리지널' 을 사용할 경우, 다음과 같은 요소를 편집하려는 루프
이제 우리가 덤프하지 s 콘솔, 우리.
Java " for-each"; 루프를 통해 이터레이션에 chunghwa 하면 두 가지 유형의 안내선:
t [] '-' (어레이에는 모든 유형의) java.lang.iterable< T> '-';;
이 ',' 인터페이스입니다 T> Iterable<, 하나뿐인 방법: 'Iterator< T>; 반복자가 () '. 이 때문에 ',' 유형 '객체를 작동됨 T> Collection<;;', ',' 연장시킵니다 Collection< T> 인터페이스입니다 Iterable< T>.
루프 언급한 바와 같이 포리치 개념은 위키백과에서 강조표시됩니다 다음과 같습니다.
>. 그러나 일반적으로 구문 포리치 달리 for 루프는 루프 >. 유지관리하지 명시적인 엇회전식 : 그들은 기본적으로 " 이렇게 말한다. >. 이 모든 것이 아닌, 이 x times" 못하며창조된 " set";). 이렇게 되면 >. 1 씩 오프하도록 간단해진다는 하면 오류가 발생할 수 있는 코드를 읽을 수 있습니다.
그래서 포리치 루프 (loop) 에 대한 개념을 사용하지 않으며 명시성 엇회전식 필요가 없다는 것을 의미하는 indexe 사용하여 목록에 트래버스합니다 따라서 준비되기까지 절약합니다 1 씩 오프하도록 오류:. 일반적인 개념을 설명하는 데 이 1 씩 오프하도록 오류, 알려 목록에 트래버스합니다 indexe 사용하여 루프를 불러키지 들 수 있다.
이전 버전 사용 '포리치' 7 '등' jave jave 루프 다음과 같이 사용할 수 있습니다.
다음은 가장 최신의 방법을 사용하여 '포리치' 8 '에서' jave 루프
(loop) '+' 포리치 람다 표현식 또는 방법이 있는 목록을 참조)
자세한 정보는 이 링크를) 는 다음과 같은 뜻이 있다.
https://www.mkyong.com/java8/java-8-foreach-examples/
자바 가상 머신 (jvm) 에 8, 그들은 포리치 소개했다. 이 목록을 사용하여 매핑하며 루프 수 있습니다.
또는
또는
다음은 이에 상응하는 표현입니다.
또한 name. domain. " foreach"; 원래 질문은 방법을 몇 가지 제한이 없는 동안, 수 없는 등의 항목을 지우시겠습니까 목록에서 이터레이션은.
제거하고 새로운 for 루프는 는 쉽게 읽을 수 있지만, 정말 필요한 경우에만 사용할 수 있는 별도의 반복자가 읽기 전용 이터레이션에 패스.
포리치 를 대체할 것을 방지하기 위해 너회의 " each":
변형 1 (일반):
변형 2 (평행광 실행 (빠른):
이 아름다운 코드에 자도으로 제거하여 모든 기본 루프을 단순화됩니다. 이를 통해 깨끗한 여바바 데이터베이스에구성원을 코드, 자리맞춤 같습니다.
다음 줄을 따라 각 티머타스크 읽어옵니다 ", t in list.".
오류의 가능성이 적은 경우에 각. # 39, t 는 반복자가 또는 초기화중 초기화중 너회가 don& 걱정할 필요가 없다 '는 루프 엇회전식 종료 및 it (있는 곳에는 유효범위 오류에 대해).
이에 앞서 8 jave 사용해야 할 사항은 다음과 같습니다.
그러나 스트리밍합니다 8 의 출시와 함께 할 수 있는 자바 가상 머신 (jvm) 에 훨씬 적은 구문을 같은 것이 있다. 예를 들어, '섬리스트 단축시킵니다' 할 수 있습니다.
[Here] 스트리밍합니다 대해 더 많이 찾을 수 있습니다.
[here): https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
모습이 될 것이라고 주장했다. 매우 크루프티.
작성자 좁히어 좋은 인프라일까요 대한 각 의 쨍쨍이고 문서용으로.