머리말
루프 용으로 향상된 도입 원인 : 이전 버전의 JDK5에서는 배열 또는 컬렉션 및 배열 길이 또는 컬렉션의 반복자에서 트래버스 요소가 더 번거 롭습니다.
새로운 구문은 JDK5에서 정의되어 있습니다. 루프가 이러한 작업을 단순화 할 수 있도록 향상되었습니다. 루프를 위해 향상된 것은 반복 가능한 인터페이스를 구현하는 배열 또는 컬렉션에서만 사용할 수 있습니다.
구문 형식 :
for (변수 유형 변수 : 반복 해야하는 배열 또는 컬렉션) {
}
Java에서는 컬렉션을 가로 지르는 컬렉션과 배열은 일반적으로 다음과 같은 세 가지 형태를 갖습니다.
for (int i = 0; i <list.size (); i ++) {system.out.print (list.get (i)+",");} iterator iterator = list.iterator (); while (iterator.hasnext ()) {system.out.print (iterator.next () + ",");} for (integer i : list) {system.out.print (i + ",");} 첫 번째는 루프 트래버스의 일반적인 것이고, 두 번째는 트래버스에 반복기를 사용하는 것이며, 세 번째는 일반적으로 루프 (각각)에 대해 향상된 것으로 호출됩니다.
구현 원리
세 번째 형태는 Java가 제공하는 구문 설탕임을 알 수 있습니다. 여기서 우리는 루프를 위해이 향상된 방법이 기본 층에서 어떻게 구현되는지 분석합니다.
다음 코드를 디 컴파일합니다.
for (Integer i : list) {system.out.println (i);}복합 후 :
정수 i; for (iterator iterator = list.iterator (); iterator.hasnext (); system.out.println (i)) {i = (integer) iterator.next (); } 소환 된 코드는 실제로 매우 복잡하므로 실행 순서대로 분류합시다.
정수 I; 임시 변수를 정의합니다. i
iterator iterator = list.iterator (); 목록의 반복자를 얻으십시오
iterator.hasnext (); 반복자에 트레이버되지 않은 요소가 있는지 여부를 결정합니다
i = (Integer) iterator.next (); 첫 번째 트레이버가없는 요소를 가져 와서 임시 변수에 할당합니다.
System.out.println (i) 임시 변수의 값을 출력합니다. i
이것은 목록의 모든 요소가 횡단 될 때까지 순환합니다.
코 컴파일을 통해 Java의 루프에 대한 강화 된 기본 층이 실제로 반복자 패턴을 통해 구현된다는 것을 알 수 있습니다.
for 루프 향상의 구덩이
이것은 루프 향상의 구덩이라고하지만 실제로는 일부 사람들이 루프 향상의 구현 원리에서 구덩이에 들어갈 수 있기 때문입니다.
루프 향상은 반복기를 통해 구현되므로 반복자의 특성이 있어야합니다.
Java에는 빠른 메커니즘이 있습니다. 반복자를 사용하여 요소를 가로 지르면 컬렉션을 삭제할 때주의해야합니다. 부적절하게 사용하면 동시 모형화 외환이 발생할 수 있습니다. 이것은 런타임 예외이며 컴파일 기간 동안 발생하지 않습니다. 프로그램이 실제로 실행될 때만 폭발합니다.
다음 코드에서와 같이 :
for (학생 stu : 학생) {if (stu.getId () == 2) 학생들 (stu); }동시 변형 추출 예외가 발생합니다.
반복자는 별도의 스레드에서 작동하며 뮤 테스 잠금 장치가 있습니다. 반복자가 생성 된 후 원래 객체를 가리키는 단일 링크 인덱스 테이블이 있습니다. 원래 객체의 수가 변경되면이 인덱스 테이블의 내용이 동시에 변경되지 않으므로 인덱스 포인터가 뒤로 이동하면 반복에 대한 객체를 찾을 수 없으므로 실패 원칙에 따라 반복자가 즉시 발생합니다.
java.util.concurrentModificationException 예외.
따라서 Ierator는 반복 된 객체가 작동 할 때 변경 될 수 없습니다.
그러나 반복자 자체 메소드 remove() 사용하여 객체를 삭제할 수 있습니다. Iterator.remove() 메소드는 현재 반복 된 객체를 삭제하면서 인덱스의 일관성을 유지합니다.
가로 질러 요소를 올바르게 삭제합니다.
Ierator <tudent> stuiter = whity.iterator (); while (stuiter.hasnext ()) {Student Student = stuiter.next (); if (student.getId () == 2) stuiter.remove (); // 여기에서 반복자 제거 메소드를 사용하여 현재 객체를 제거해야합니다. 목록 제거 메소드를 사용하면 ConcurrentModificationException도 나타납니다} 좋아, 여기서 나는 for 루프를 향상시키는 구현 원칙과 당신이 그것을 부적절하게 사용하면 당신이 속할 수있는 함정을 소개 할 것입니다. 따라서 간단한 각각의 구문이지만 원칙을 이해해야합니다. 그렇지 않으면 설명 할 수없는 문제가 발생할 수 있습니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.