首頁 Java java教程 java新特性之for迴圈最全的用法總結

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

Jan 21, 2017 pm 04:18 PM

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles