首頁  >  文章  >  Java  >  java新特性之for迴圈最全的用法總結

java新特性之for迴圈最全的用法總結

高洛峰
高洛峰原創
2017-01-21 16:18:361608瀏覽

1. 增強for概述

增強for循環,也叫Foreach循環,用於數組和容器(集合類別)的遍歷。使用foreach循環遍歷數組和集合元素時,無需獲得數組和集合長度,無需根據索引來訪問數組元素和集合元素,大大提高的效率,代碼也簡潔不少。

2. Oracle官網的解釋

所以你應該什麼時候使用for-each循環?任何時候都可以。這真的美化你的程式碼。不幸的是,你不能在任何地方使用它。考慮這些情況,例如,刪除方法。為了移除目前的元素,程式需要存取迭代器。 for-each迴圈隱藏了迭代器,所以你不能呼叫刪除功能。因此,for-each循環不適用於過濾元素。同樣當遍歷集合或陣列時需要替換元素的循環也是不適用的。最後,它不適用於多個集合迭代中並行循環使用。設計師應該了解這些缺陷,有意識地設計一個乾淨,簡單的構造,來避免這些情況。有興趣的可以查看官網的API,如果不知道怎麼在官網找到API,請點選開啟官網查看API方法。

3. 增強for格式

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

當你看到冒號(:),它讀作「進來。」上述循環讀作「把c中的每個TimerTask元素進行遍歷。」正如你所看到的, for-each結構完美的與泛型結合。它保留了所有類型的安全性,同時去除剩餘的混亂。因為你不必聲明迭代器,你不必為它提供一個泛型的聲明。 (編譯者在你背後已經做了,你不需要關心它。)


簡單體驗下:

1.增強for遍歷陣列

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遍歷集合

    


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實際上是隱藏了迭代器,所以不用創建迭代器自然代碼簡潔不少。這也是增強for推出的原因,就是為了減少程式碼,方便遍歷集合和陣列,提高效率。

注意:正因為增強for隱藏了迭代器,所以用增強for遍歷集合和陣列時,要先判斷是否為null,否則會拋出空指標異常。原因很簡單,底層需要用數組或集合物件去調用iterator()方法去創建迭代器(Iterator迭代器是一個接口,所以要用子類來實現),如果是null,肯定拋出異常。

5. 增強for的適用性以及限制

1.適用性

適用於集合和陣列的遍歷。

2.限制:

①集合不能為null,因為底層是迭代器。

②隱藏了迭代器,所以在遍歷集合時不能對集合進行修改(增刪)。

③不能設定角標。

6.增強for用法詳解

1.增強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));
        }
    }
}

2.增強for在集合中使用

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);
 }
 }
}

   

. :必須與泛型完美結合,不然也得手動向下轉化

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");
 }
 
 }

   

rr程式碼如果去掉註解的兩行程式碼,程式就會報錯,因為集合沒有宣告元素是什麼類型,迭代器自然也不知道是什麼類型。所以沒有泛型,那麼就要向下轉型,只能用迭代器,不能用增強for。

2.泛型與增強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;
 }
 
}

4.List遍歷四種方法

Collection介面中有iterator()方法,傳回的是Iterator

Collection介面中有iterator()方法,回傳的是Iterator

Collection介面中有iterator()方法,回傳的是Iterator

Collection介面中有iterator()方法,傳回的是Iterator為Iterator。 List中有listIterator()方法,所以多了一個集合器ListIterator,其子類別LinkedList、ArrayList、Vector都實作了List和Collection接口,所以都可以用兩個迭代器遍歷。

程式碼測試

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();
 }
 }
}

   

5.Set集合遍歷2中方法

由於Set集合沒有get(int index)方法,所以沒有普通for循環,Set中沒有listIterator(Iterator器。所以只有兩種遍歷方式。

程式碼測驗

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()));
 }
 }
}

   

7.歸納總結

1.增強for的適用性以及限制

適用性:適用於集合和數組的限制組。

限制:

①集合不能為null,因為底層是迭代器。

②不能設定角標。

③隱藏了迭代器,所以在遍歷集合時不能對集合進行修改(增刪)。

2.在集合中增強for與泛型結合,才能發揮新特性的功能。

3.查看官網新特性挺重要的,要知其然還要知其所以然,瞭如心中,才能運用自如。

以上這篇java新特性之for循環最全的用法總結就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持PHP中文網。

更多java新特性之for循環最全的用法總結相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn