1. 程式人生 > >使用 Java foreach 遇到的問題

使用 Java foreach 遇到的問題

本來以為使用foreach就和使用for迴圈是一樣的效果,結果,卻遇到了意料之外的事情。

先來看一個例子:

    public void testArray() {
        //定義一個一維陣列 
        int arr[] = {1,3,2,4}; 
        System.out.println("----輸出剛剛定義的陣列----"); 
        for (int x : arr) {             
            System.out.println(x);          
        } 

        //通過索引給陣列元素賦值 
System.out.println("----通過foreach迴圈修改陣列元素的值----"); for (int x : arr) { x *= 2; System.out.println(x); } //迴圈輸出建立的陣列 System.out.println("----修改後,foreach重新輸出陣列元素的值----"); for (int x : arr) { System.out.println(x); } }

執行出來的結果:

----輸出剛剛定義的陣列----
1
3
2
4
----通過foreach迴圈修改陣列元素的值----
2
6
4
8
----修改後,foreach重新輸出陣列元素的值----
1
3
2
4

咦,怎麼沒有修改過來?

網上查詢答案,這個說得比較明白:

給你舉一個例子,你看一下可能比較能理解:

for(int element:array1){//question:為什麼用Foreach無法給陣列賦值。
   element =  r.nextInt(101)+1;
   System.out.println(element);

}//雖然可以輸出十個隨機數,但並沒有把十個隨機數賦給array1陣列。

這其中的執行過程是這樣的
element = array1[i]
element = 隨機數
syso(element)
element是個基本資料型別,他不指向陣列元素的地址,他只代表數字他自己。

當理解了這個例子,你現在就應該知道foreach這東西的限制了。那就是不能修改陣列元素,為什麼呢?因為每一次loop你只是獲得了當前元素的值,卻沒有獲得當前元素在陣列中的物件控制代碼。這樣你就無法直接操作對應的控制代碼。

所以當你想遍歷陣列並只想獲得元素值的時候才用foreach。其他的時候比如想修改陣列,或者想獲得index的時候就別用foreach。

現在,我們是想修改陣列的值,那麼就不能使用foreach了,還是使用for迴圈吧:

    public void testArray1() {
        //定義一個一維陣列 
        int arr[] = {1,3,2,4}; 
        System.out.println("----輸出剛剛定義的陣列----"); 
        for (int x : arr) {             
            System.out.println(x);          
        } 

        //通過索引給陣列元素賦值 
        System.out.println("----通過迴圈變數給陣列元素賦值----");        
        for (int i = 0; i < arr.length; i++) { 
            arr[i] *= 2; 
            System.out.println(arr[i]);         
        } 

        //迴圈輸出建立的陣列 
        System.out.println("----修改後,foreach重新輸出陣列元素的值----"); 
        for (int x : arr) { 
            System.out.println(x); 
        }        
    }

執行結果如下:

----輸出剛剛定義的陣列----
1
3
2
4
----通過迴圈變數給陣列元素賦值----
2
6
4
8
----修改後,foreach重新輸出陣列元素的值----
2
6
4
8

長吁一口氣,終於恢復正常了。

相關推薦

java foreach

nbsp col name ring AS array reac foreach sys List<String> names = new ArrayList<>(); names.add("zhangsan");

Java foreach remove問題分析

expect 部分 特殊 tlist err 成了 cat sys 程序 原文鏈接:http://www.cnblogs.com/chrischennx/p/9610853.html 都說ArrayList在用foreach循環的時候,不能add元素,也不能remove元

java foreach的原理

 在平時Java程式中,應用比較多的就是對Collection集合類的foreach遍歷,foreach之所以能工作,是因為這些集合類都實現了Iterable介面,該介面中定義了Iterator迭代器的 產生方法,並且foreach就是通過Iterable介面在序列中進行移動。

JAVA foreach和普通for迴圈是否需要判斷為null

測試增強for迴圈是否需要判斷為null 例1: public static void main(String[] args) { List<Object> list = n

使用 Java foreach 遇到的問題

本來以為使用foreach就和使用for迴圈是一樣的效果,結果,卻遇到了意料之外的事情。 先來看一個例子: public void testArray() { //定義一個一維陣列 int arr[] = {1,3,

Java foreach(加強for迴圈)

foreach語句是java5的新特徵之一,在遍歷陣列、集合方面,foreach為開發人員提供了極大的方便。 foreach語句是for語句的特殊簡化版本,但是foreach語句並不能完全取代for語

java foreach與for遍歷效率對比

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">由於本人在準備秋招,所以在看到foreach和for那個遍歷效率更高的問

java foreach迴圈為什麼不能賦值

直接上程式碼 public class test4 { public static void main(String args[]){ int [] a=new int[3]; for(int j:a){

java foreach遍歷順序

在java中,我們經常使用foreach(官方說法:The enhanced for statement)的形式來遍歷Collection和Array,那麼遍歷的順序是怎麼樣的呢? 一般,我們使用如下的形式來使用foreach的功能: for(var x

Java Foreach拉姆達表示式

以下案例分析了foreach迴圈和Java8 拉姆達表示式的區別 public static void main(String[]

Java 爬蟲上資料非同步載入,試試這兩種辦法!

這是 Java 爬蟲系列博文的第三篇,在上一篇 Java 爬蟲遇到需要登入的網站,該怎麼辦? 中,我們簡單的講解了爬蟲時遇到登入問題的解決辦法,在這篇文章中我們一起來聊一聊爬蟲時遇到資料非同步載入的問題,這也是爬蟲中常見的問題。 現在很多都是前後端分離專案,這會使得資料非同步載入問題更加突出,所以你在爬蟲時遇

Java語法糖2:foreach循環

span arraylist iter col 聯想 length pop nts ets 增強for循環與普通for循環相比,功能更強並且代碼更簡潔 寫一段代碼: @Test public void test_foreach() { Li

JAVA基礎_增強for循環:foreach

增強for padding style pre div value java 通過 pad 通常,訪問List,Array,Set中的數據都是通過以下這種方式訪問的int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (in

Selenium TestNG Java環境搭建過程中所問題匯總

fin method 搭建過程 onf 9.png 未在 can ann ogr 【問題一】運行時報Unalbe to connect to host 127.0.0.1 on port 7855 【問題分析】Selenium版本與火狐版本不一致,需要下載對應的版本 【

Java的叠代和foreach循環

com 折扣 sys 條件表達式 amba num numbers html 輸出結果 Java的叠代(interation statement) Java的叠代(interation statement) 其實就是循環控制語句while、do-while和for,因為他們

java關於集合的遍歷與增強for循環(foreach)的使用

鍵值 sys import i++ 叠代器 iterator int 傳統 內部 java集合類的使用可以說是無處不在,總的我們可以將之分為三大塊,分別是從Collection接口延伸出的List、Set和以鍵值對形式作存儲的Map類型集合。 許多情況需要我們遍

Java 8 forEach簡單例子

acl toolbar .get lambda ren lang ora contain contains 1.1 通常這樣遍歷一個Map Map<String, Integer> items = new HashMap<>(); items.p

java基礎40 增強for循環(也叫foreach循環)

叠代器 pac 評論 數據 urn border https 抽象 oid 增強for循環是jdk1.5出現的新功能 1、增強for循環的作用 簡化了叠代器的書寫格式(註意:增強for循環底層還是使用了叠代器遍歷) 2、增強for循環的格式 for(數據類型 變

Java語法糖(1):可變長度參數以及foreach循環原理

i++ javap反編譯 信息 所有 子接口 inter new 編譯 意思 語法糖 接下來幾篇文章要開啟一個Java語法糖系列,所以首先講講什麽是語法糖。語法糖是一種幾乎每種語言或多或少都提供過的一些方便程序員開發代碼的語法,它只是編譯器實現的一些小把戲罷了,編譯期間以特

JAVAforeach實現遍歷

import java.util.Arrays; public class HelloWorld { public static void main(String[] args) { // 定義一個整型陣列,儲存成績資訊 int[] scores = {