>  기사  >  Java  >  Java의 새로운 기능인 for 루프 사용법에 대한 가장 포괄적인 요약입니다.

Java의 새로운 기능인 for 루프 사용법에 대한 가장 포괄적인 요약입니다.

高洛峰
高洛峰원래의
2017-01-21 16:18:361578검색

1. Enhanced for 개요

Foreach 루프라고도 하는 향상된 for 루프는 배열 및 컨테이너(컬렉션 클래스)를 탐색하는 데 사용됩니다. foreach 루프를 사용하여 배열 및 컬렉션 요소를 순회하는 경우 배열 및 컬렉션 길이를 가져올 필요가 없으며 인덱스를 기반으로 배열 요소 및 컬렉션 요소에 액세스할 필요가 없으므로 효율성이 크게 향상되고 코드가 훨씬 단순해집니다. .

2. 오라클 공식 홈페이지 설명

그러면 언제 for-each 루프를 사용해야 할까요? 언제든지 괜찮습니다. 이것은 정말 코드를 아름답게 만듭니다. 불행히도 모든 곳에서 사용할 수는 없습니다. 예를 들어 메소드 제거와 같은 경우를 고려하십시오. 현재 요소를 제거하려면 프로그램이 반복자에 액세스해야 합니다. for-each 루프는 반복자를 숨기므로 삭제 함수를 호출할 수 없습니다. 따라서 for-each 루프는 요소 필터링에 작동하지 않습니다. 컬렉션이나 배열을 반복할 때 요소를 교체해야 하는 루프도 적용할 수 없습니다. 마지막으로 여러 컬렉션 반복에 걸쳐 병렬 루프에 사용하는 데 적합하지 않습니다. 설계자는 이러한 함정을 인식하고 이러한 상황을 피하기 위해 의식적으로 깨끗하고 단순한 구조를 설계해야 합니다. 관심이 있으시면 공식 웹사이트에서 API를 보실 수 있습니다. 공식 웹사이트에서 API를 찾는 방법을 모르신다면 클릭하여 공식 웹사이트를 열어 API 방법을 확인하세요.

3.

for(集合或者数组元素的类型 变量名 : 集合对象或者数组对象){
 
引用变量名的java语句;
 
}

형식이 향상되었습니다. 콜론(:)이 표시되면 "Come in"이라고 읽습니다. 위 루프는 "C의 각 TimerTask 요소를 탐색합니다."라고 읽습니다. for-each 구문은 제네릭과 완벽하게 결합됩니다. 나머지 혼란을 제거하면서 모든 유형의 보안을 유지합니다. 반복자를 선언할 필요가 없기 때문에 이에 대한 일반 선언을 제공할 필요가 없습니다. (컴파일러가 이미 뒤에서 수행했기 때문에 신경 쓸 필요가 없습니다.)


간단한 경험:

1. 🎜>

package cn.jason01;
//增强for遍历数组
public class ForTest01 {
 public static void main(String[] args) {
 int[] array={1,2,3};
 for(int element: array){
 System.out.println(element);
 }
 }
}

2. for

package cn.jason01;
 
import java.util.ArrayList;
 
public class ForTest {
 public static void main(String[] args) {
 // 泛型推断,后面可以写可以不写String
 ArrayList<String> array = new ArrayList();
 array.add("a");
 array.add("b");
 array.add("c");
 for (String string : array) {
 System.out.println(string);
 }
 
 }
}


for

의 기본 원리를 강화합니다. 먼저 코드를 보세요

package cn.jason01;
 
import java.util.ArrayList;
import java.util.Iterator;
 
/**
 * 增强for底层原理
 *
 * @author cassandra
 * @version 1.1
 */
public class ForTest {
    public static void main(String[] args) {
        // 泛型推断,后面可以写可以不写String.规范一些是要写上的。
        ArrayList<String> array = new ArrayList();
        // 添加元素
        array.add("a");
        array.add("b");
        array.add("c");
 
        // 增强for实现
        System.out.println("----enhanced for----");
        for (String string : array) {
            System.out.println(string);
        }
 
        // 反编译之后的效果,也就是底层实现原理
        System.out.println("---reverse compile---");
        String string;
        for (Iterator iterator = array.iterator(); iterator.hasNext(); System.out.println(string)) {
            string = (String) iterator.next();
 
        }
 
        // 迭代器实现
        System.out.println("------Iterator------");
        for (Iterator<String> i = array.iterator(); i.hasNext(); System.out.println(i.next())) {
 
        }
 
        // 普通for实现
        System.out.println("-----general for-----");
        for (int x = 0; x < array.size(); x++) {
            System.out.println(array.get(x));
        }
    }
}

위 코드에서 볼 수 있듯이 Enhanced for는 실제로 Iterator를 숨기므로 Iterator를 만들 필요가 없습니다. 이므로 코드가 훨씬 간단해졌습니다. 이는 코드를 줄이고 컬렉션과 배열의 탐색을 용이하게 하며 효율성을 향상시키기 위해 향상된 for를 도입한 이유이기도 합니다.

참고: Enhanced for는 반복자를 숨기기 때문에 Enhanced for를 사용하여 컬렉션과 배열을 순회하는 경우 먼저 null인지 확인해야 합니다. 그렇지 않으면 null 포인터 예외가 발생합니다. 이유는 매우 간단합니다. 맨 아래 레이어에서는 iterator() 메서드를 호출하여 반복자를 생성해야 합니다(Iterator는 인터페이스이므로 하위 클래스에서 구현해야 함). 예외는 확실히 발생합니다.

5.

의 적용성 및 제한 사항을 강화합니다. 1. 적용성

세트 및 배열 순회에 적용됩니다.

2. 제한 사항:

① 기본 레이어가 반복자이므로 컬렉션은 null일 수 없습니다.

②iterator가 숨겨져 있으므로 컬렉션 순회 시 컬렉션 수정(추가 또는 삭제)이 불가능합니다.

③코너마크는 설정할 수 없습니다.

6. 향상된 사용법에 대한 자세한 설명

1. 배열에서의 사용을 위한 향상된 기능

package cn.jason05;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * 增强for用法
 *
 * @author cassandra
 */
public class ForDemo {
 public static void main(String[] args) {
 // 遍历数组
 int[] arr = { 1, 2, 3, 4, 5 };
 for (int x : arr) {
 System.out.println(x);
 }
 }
}

2.
package cn.jason05;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * 增强for用法
 *
 * @author cassandra
 */
public class ForDemo {
 public static void main(String[] args) {
 // 遍历集合
 ArrayList<String> array = new ArrayList<String>();
 array.add("hello");
 array.add("world");
 array.add("java");
 
 for (String s : array) {
 System.out.println(s);
 }
 
 // 集合为null,抛出NullPointerException空指针异常
 List<String> list = null;
 if (list != null) {
 for (String s : list) {
 System.out.println(s);
 }
 }
 
 // 增强for中添加或修改元素,抛出ConcurrentModificationException并发修改异常
 for (String x : array) {
 if (array.contains("java"))
 array.add(1, "love");
 }
 
 }

3. 제네릭의 완벽한 조합 및 향상된 기능

참고: 제네릭과 완벽하게 결합되어야 하며, 그렇지 않으면 수동으로 아래쪽으로 변환해야 합니다

1. 일반 효과가 없으며 for

학생 수업

package cn.jason01;
 
public class Student {
 private String name1;
 private String name2;
 
 public Student() {
 super();
 }
 
 public Student(String name1, String name2) {
 super();
 this.name1 = name1;
 this.name2 = name2;
 }
 
 public String getName1() {
 return name1;
 }
 
 public void setName1(String name1) {
 this.name1 = name1;
 }
 
 public String getName2() {
 return name2;
 }
 
 public void setName2(String name2) {
 this.name2 = name2;
 }
 
}

테스트 코드

package cn.jason01;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class Test02 {
 public static void main(String[] args) {
 // 创建集合1
 List list1 = new ArrayList();
 list1.add("a");
 list1.add("b");
 list1.add("c");
 
 // 创建集合2
 List list2 = new ArrayList();
 list2.add("d");
 list2.add("e");
 list2.add("f");
 // 创建集合三
 List list3 = new ArrayList();
 
 // 遍历第一和第二个集合,并添加元素到集合三
 for (Iterator i = list1.iterator(); i.hasNext();) {
 // System.out.println(i.next());
 String s = (String) i.next();
 for (Iterator j = list2.iterator(); j.hasNext();) {
 // list2.add(new Student(s,j.next()));
 String ss = (String) j.next();
 list3.add(new Student(s, ss));
 }
 }
 
 // 遍历集合三,并输出元素
 Student st;
 for (Iterator k = list3.iterator(); k.hasNext(); System.out
 .println(new StringBuilder().append(st.getName1()).append(st.getName2()))) {
 st = (Student) k.next();
 }
 }
}

위 코드에서 주석 처리된 코드 두 줄을 제거하면 프로그램은 오류를 보고합니다. 컬렉션이 요소의 유형을 선언하지 않기 때문입니다. 반복자는 당연히 그것이 어떤 유형인지 알지 못합니다. 따라서 Generic이 없으면 하향 변환이 필요하며 Iterator만 사용할 수 있으며 Enhanced for는 사용할 수 없습니다.

2.

위 코드의 일반 수정

package cn.jason01;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
/**
 * 增强for和泛型完美结合
 *
 * @author cassandra
 */
public class Test03 {
 public static void main(String[] args) {
 // 创建集合1
 List<String> list1 = new ArrayList<String>();
 list1.add("a");
 list1.add("b");
 list1.add("c");
 
 // 创建集合2
 List<String> list2 = new ArrayList<String>();
 list2.add("d");
 list2.add("e");
 list2.add("f");
 // 创建集合三
 List<Student> list3 = new ArrayList<Student>();
 
 //// 遍历第一和第二个集合,并添加元素到集合三
 for (String s1 : list1) {
 for (String s2 : list2) {
 list3.add(new Student(s1, s2));
 }
 }
 
 // 遍历集合三,并输出元素
 for (Student st : list3) {
 System.out.println(new StringBuilder().append(st.getName1()).append(st.getName2()));
 }
 }
}

4. 목록 수집 탐색을 위한 네 가지 방법

Collection 인터페이스에는 Iterator 유형을 반환하는 iterator() 메서드가 있습니다. Iterator라는 반복자가 있습니다. List에는 listIterator() 메서드가 있으므로 추가 수집기 ListIterator가 있습니다. 해당 하위 클래스 LinkedList, ArrayList 및 Vector는 모두 List 및 Collection 인터페이스를 구현하므로 두 개의 반복기로 탐색할 수 있습니다.

코드 테스트

package cn.jason05;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
 
/**
 * 这是List集合遍历四种方法
 *
 * @author cassandra
 */
 
public class ForDemo01 {
 public static void main(String[] args) {
 // 创建集合
 List<String> list = new ArrayList<String>();
 list.add("hello");
 list.add("world");
 list.add("java");
 
 // 方法1,Iterator迭代器遍历
 Iterator<String> i = list.iterator();
 while (i.hasNext()) {
 String s = i.next();
 System.out.println(s);
 }
 
 // 方法2,ListIterator迭代器遍历集合
 ListIterator<String> lt = list.listIterator();
 while (lt.hasNext()) {
 String ss = lt.next();
 System.out.println(ss);
 }
 
 // 方法3,普通for遍历集合
 for (int x = 0; x < list.size(); x++) {
 String sss = list.get(x);
 System.out.println(sss);
 }
 
 // 方法4,增强for遍历集合
 for (String ssss : list) {
 System.out.println(ssss);
 }
 
 }
}

5.Set 컬렉션 순회 2가지 방법

Set 컬렉션에 get(int가 없기 때문에) index) 메서드이므로 일반적인 for 루프가 없고 Set에는 listIterator() 메서드가 없으므로 ListIterator 반복자가 없습니다. 따라서 통과하는 방법은 두 가지뿐입니다.

코드 테스트

rree

7. 요약

1. > 적용 가능성: 컬렉션 및 배열 순회에 적합합니다.

제한 사항:

① 기본 레이어가 반복기이므로 컬렉션은 null일 수 없습니다.

②모서리 표시를 설정할 수 없습니다.

③반복자가 숨겨져 있으므로 컬렉션 순회 시 컬렉션을 수정(추가 또는 삭제)할 수 없습니다.

2. 새로운 기능을 활용하려면 컬렉션에서 for와 generics의 조합을 강화하세요.

3. 공식 웹사이트의 새로운 기능을 확인하는 것은 매우 중요합니다. 그것이 무엇인지 알기 위해서는 그 이유도 마음속으로 이해해야만 자유롭게 사용할 수 있습니다.

Java의 새로운 기능인 for 루프의 가장 완벽한 사용법에 대한 위의 요약은 모두 편집자가 공유한 내용이므로 참고가 되기를 바랍니다. PHP 중국어 웹사이트.

새로운 Java 기능인 for 루프의 가장 완전한 사용법 요약에 대한 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.