Java の新機能である for ループの使用法を最も包括的にまとめたもの

高洛峰
リリース: 2017-01-21 16:18:36
オリジナル
1613 人が閲覧しました

1. 拡張された for の概要

拡張された for ループは、Foreach ループとも呼ばれ、配列とコンテナー (コレクション クラス) を走査するために使用されます。 foreach ループを使用して配列およびコレクション要素を走査する場合、配列およびコレクションの長さを取得する必要がなく、インデックスに基づいて配列要素やコレクション要素にアクセスする必要もないため、効率が大幅に向上し、コードが大幅に簡素化されます。 。

2. Oracle公式Webサイトからの説明

それでは、どのような場合にfor-eachループを使用する必要があるのでしょうか?いつでも大丈夫です。これにより、コードが本当に美しくなります。残念ながらどこでも使えるわけではありません。たとえば、メソッドを削除する場合などを考えてみましょう。現在の要素を削除するには、プログラムはイテレータにアクセスする必要があります。 for-each ループはイテレータを非表示にするため、delete 関数を呼び出すことはできません。したがって、for-each ループは要素のフィルター処理には機能しません。コレクションまたは配列を反復処理するときに要素の置換が必要なループも適用できません。最後に、複数のコレクション反復にわたる並列ループでの使用には適していません。設計者はこれらの落とし穴を認識し、これらの状況を避けるためにクリーンでシンプルな構造を意識的に設計する必要があります。ご興味がございましたら、公式 Web サイトで API をご覧ください。公式 Web サイトで API を見つける方法がわからない場合は、クリックして公式 Web サイトを開いて API メソッドをご覧ください。

3. 拡張された形式

for(集合或者数组元素的类型 变量名 : 集合对象或者数组对象){
 
引用变量名的java语句;
 
}
ログイン後にコピー

コロン (:) が表示されると、「入ってくる」と表示されます。ご覧のとおり、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. コレクションを走査するための機能強化

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);
 }
 
 }
}
ログイン後にコピー


4 . 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));
        }
    }
}
ログイン後にコピー

上記のコードからわかるように、強化された for は実際にはイテレータを非表示にします。したがって、イテレータを作成する必要がなく、コードははるかに単純です。これは、コードを削減し、コレクションと配列の走査を容易にし、効率を向上させるために拡張された for を導入する理由でもあります。

注: 拡張 for は反復子を非表示にするため、拡張 for を使用してコレクションと配列を走査する場合は、最初にそれが null かどうかを判断する必要があります。そうしないと、null ポインター例外がスローされます。理由は非常に簡単です。最下層は、配列またはコレクション オブジェクトを使用して iterator() メソッドを呼び出してイテレーターを作成する必要があります (Iterator はインターフェースであるため、null の場合はサブクラスによって実装される必要があります)。必ず例外がスローされます。

5. for

1 の適用性と制限を強化します。 セットと配列の走査に適用できます。

2. 制限事項:

①基礎となる層が反復子であるため、コレクションを null にすることはできません。

②反復子は非表示になっているため、コレクションを走査するときにコレクションを変更(追加または削除)することはできません。

③コーナーマークは設定できません。

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);
 }
 }
}
ログイン後にコピー

3. ジェネリックと拡張された for

の組み合わせ注意: ジェネリックと完全に組み合わせる必要があります。そうでない場合は、手動で下向きに変換する必要があります

1。ジェネリック効果がないと、拡張された for

Student クラス

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");
 }
 
 }
ログイン後にコピー

テストコード

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;
 }
 
}
ログイン後にコピー

を使用できません。上記の 2 行のコメント コードを削除すると、プログラムはエラーを報告します。これは、コレクションが要素の型を宣言しておらず、イテレータは必然的に要素の型を認識しないためです。したがって、ジェネリックがない場合は、下方変換が必要となり、イテレータのみを使用でき、拡張されたものは使用できません。

2. ジェネリックと拡張機能

ジェネリックは上記のコードを変更します

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();
 }
 }
}
ログイン後にコピー

4. リスト コレクションの 4 つのメソッド

Collection インターフェイスには、Iterator 型を返し、イテレータを持つ iterator() メソッドがあります。イテレータの場合。 List には listIterator() メソッドがあるため、追加のコレクタ ListIterator があり、そのサブクラスである LinkedList、ArrayList、および Vector はすべて List インターフェイスと Collection インターフェイスを実装しているため、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()));
 }
 }
}
ログイン後にコピー

5. Setコレクション走査2メソッド

Setコレクションにはget(intindex)メソッドがないため、通常のforループやlistIterator()メソッドはありません。 Set にあるため、ListIterator 反復デバイスはありません。したがって、横断する方法は 2 つだけです。

コードテスト

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);
 }
 
 }
}
ログイン後にコピー

7. 概要

1. for

の適用性と制限を強化する 適用性: コレクションと配列の走査に適しています。

制限事項:

①基礎となる層が反復子であるため、コレクションをnullにすることはできません。

②コーナーマークは設定できません。

③反復子は非表示になっているため、コレクションを走査するときにコレクションを変更 (追加または削除) することはできません。

2. 新しい機能を活用するために、コレクション内の for とジェネリックの組み合わせを強化します。

3. 公式ウェブサイトの新機能を確認することは非常に重要であり、その機能を頭の中で理解して初めて自由に使用できるようになります。

Java の新機能である for ループの最も完全な使用法に関する上記の要約は、エディターによって共有されたすべての内容です。参考にしていただければ幸いです。また、PHP 中国語 Web サイトをサポートしていただければ幸いです。

for ループの使用法や Java の新機能に関する最も包括的な概要に関するより関連性の高い記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート