[轉載] Java-forEach增強for循環是值傳遞規則詳解

參考鏈接: Java中的for-each循環

1. 引入?

?正如Java語法意義,變量的傳遞只有值傳遞,雖然變量分為引用變量和基本類型變量,前者更像C中的地址概念。 在學習Lambda表達式的時候,遇到了試圖在增強for循環中對原鏈表元素重新賦值失敗的問題,網絡上也沒有針對此的其他博文,故開此文。?

2. 數組的增強for循環?

public class Test1{

?

? ? public static void main(String[] args) {

? ??

? ? ? ? int[] arr = new int[10];

?

? ? ? ? for (int temp :arr){

? ? ? ? ? ? temp++;

? ? ? ? }

?

? ? ? ? for (int temp :arr){

? ? ? ? ? ? System.out.println(temp);

? ? ? ? }

?

?

? ? }

}

?

?控制臺會打出10個0,而不是1,這表明在forEach語句中temp++操作對arr數組本身沒有任何影響,所以間接證明了,增強for循環中只是值傳遞。這也可以從原理層面解釋:增強for循環作為一個語法糖,其執行順序是:對數組第一個元素復制給臨時變量temp,然后讓temp執行循環中的語句;接著對數組第二個元素再次賦值給臨時變量temp,再次讓其執行for循環中的語句…就這般執行至數組最后一個元素。所以說,temp接受了數組元素的值,在++,這對于數組中的數字沒有任何影響。所以說如果要進行原數組的更改,更好的方式是使用普通的for循環。?

3. ArrayList的增強for循環?

?代碼需求是將其list中的String類型對象從小寫轉換為大寫;?

public class LowercaseToUppercase{

?

? ? public static void main(String[] args) {

?

? ? ? ? List<String> list = Arrays.asList("hello", "world", "hello world");

?

? ? ? ? list.forEach(i -> {

? ? ? ? ? ? i = i.toUpperCase();

? ? ? ? });

?

? ? ? ? list.forEach(System.out::println);

? ? }

}

?

?

?控制還是輸出小寫的String類型對象,“hello”, “world”, “hello world”,倘若你查看forEach方法,你可以發現此原理和第一個例子的數組遍歷實現原理是一樣的,i作為一個中間變量,是臨時存放了String類型的引用變量,但是對原list沒有任何影響,如下面被調用的forEach方法的默認實現代碼(其中t就是被定義為泛型類型T的臨時變量)。 ?一個易錯點:很多人認為:因為String內部是final修飾的數組,不能被重新賦值,臨時變量i只能指向新的引用對象,所以上述代碼功能才不能被實現,這是不對的,其真正的原因是對臨時變量賦值是無法達到預期效果。正確的理解是:對臨時變量進行賦值,只能使臨時變量指向新的對象,而對原String對象沒有任何作用。即使將上述代碼中ArrayList的對象類型由String換成StringBuilder類,在這樣的情況下,雖然同一個```StringBuilder``對象的值是可以被修改的,但是使用對臨時變量賦值的操作還是不能對原數據結構元素值造成影響。?

?如果要實現,需要調用StringBuilder類對象的方法,一般是返回this對象,代碼如下所示:?

public class LowercaseToUppercase {

?

? ? public static void main(String[] args) {

? ?

? ? ? ? List<StringBuilder> list3= Arrays.asList(new StringBuilder("hello"),

? ? ? ? new StringBuilder("world"),new StringBuilder("hello world"));

?

? ? ? ? list3.forEach(i->

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? String str= i.toString().toUpperCase();

? ? ? ? ? ? ? ? ? ? i.replace(0,str.length(),str);

? ? ? ? ? ? ? ? }

?

? ? ? ? );

? ? ? ? list3.forEach(System.out::println);

?

? ? }

}

?

?

?控制臺輸出了大寫的字符串,說明我們成功將StringBuilder類型由小寫轉化為大寫,不過遍歷中的臨時變量i的賦值語句并不存在,而是調用其方法,返回this對象,才實現了轉換。?

?下面這個代碼塊是Java集合的forEach方法默認實現,一定要讀懂它:?

? ?default void forEach(Consumer<? super T> action) {

? ? ? ? Objects.requireNonNull(action);

? ? ? ? for (T t : this) {

? ? ? ? ? ? action.accept(t);

? ? ? ? }

? ? }

?

?可見Java在foreach語言的執行上保證了原數據結構的安全性,如果確定要更改原數據結構,請使用傳統的for循環。并且我們在foreach語句中可以采用復制給新數據結構的方法實現類似的作用:?

? ? ? ? List<String> list2 = new ArrayList<>();

?

? ? ? ? list.forEach(item->list2.add(item.toUpperCase()));

?

? ? ? ? list2.forEach(System.out::println);

?

?倘若返回list2,那么和傳統的for語句也是類似的效果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540383.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540383.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開始吧

2019獨角獸企業重金招聘Python工程師標準>>> 寫C三年有余&#xff0c;在技術方面也算小有所成。準備在這里分享一些C進階、Python、Golang技術文章。 CSDN博客地址&#xff1a; http://blog.csdn.net/godmaycry 以后博客同步更新。 轉載于:https://my.oschina.net/u…

[轉載] 常用應屆生Java開發筆試面試題(更新中)

參考鏈接&#xff1a; Java中的循環的重要事項 Java開發面試題 Java基礎篇Java8大基本數據類型Java的三大特性面向對象如果讓你推銷一款Java產品&#xff0c;你會怎么推銷呢&#xff1f;&#xff08;java的特點&#xff09;JVM與字節碼JDK與JREStringBuilder和StringBuffer的區…

java/javascript 時間操作工具類

一、java 時間操作工具類 import org.springframework.util.StringUtils;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List;/*** 時間操作工具類** author zwq**/ public …

[轉載] java語言程序設計-基礎篇

參考鏈接&#xff1a; Java中的決策制定(if&#xff0c;if-else&#xff0c;switch&#xff0c;break&#xff0c;continue&#xff0c;jump) 第1章&#xff0c;計算機、程序和Java概述 包括【每個java初學者都應該搞懂的問題】 http://blog.csdn.net/haobo920/article/detai…

Exchange server 2013(十四)WSUS部署及組策略設置(2)

我們繼續上一節未完的博客&#xff0c;繼續我們的WSUS設置。[上一章節標題&#xff1a;Exchange server 2013(十四)WSUS部署及組策略設置(1) 網址&#xff1a;http://1183839.blog.51cto.com/blog/1173839/1182366] 首先單擊自動審批,來修改審批規則,也就是說當wsus偵測到新的更…

[轉載] Python中的switch語句的替代品

參考鏈接&#xff1a; Java中的switch語句 Python 中沒有 switch語句。 一般用if-else 語句可以替代switch語句&#xff0c;今天學習了使用字典的映射來代替switch語句。Mark一下 day 8; def get_sunday(): return sunday def get_monday(): return monday def get_tues…

“□” 表情無法在 Android 設備顯示? 快試試 EmojiCompact 表情兼容庫

有了支持庫 v26 下的 Compact 庫&#xff0c;基于 API 19 及更高版本開發的應用就能獲得 emoji 的向下兼容&#xff0c;再也不會看到顯示失敗的 “豆腐塊” 啦。如要使用 EmojiCompact&#xff0c;需要在應用啟動時通過下載或者打包字體來初始化庫。通過集成小插件&#xff0c;…

[轉載] jstl獲取Parameter參數及switch使用

參考鏈接&#xff1a; Java中的字符串使用switch <% taglib uri"/WEB-INF/tld/c.tld" prefix"c" %> param 獲取 Parameter參數 <c:choose> <c:when test"${empty param.name}"> Please enter your name. …

syslinux 制作多系統啟動U盤

syslinux 制作多系統啟動U盤標簽&#xff1a;u盤使用 syslinux 制作多系統啟動U盤 syslinux 能加載虛擬內存盤&#xff0c;能引導各種鏡像文件&#xff0c;適合用于制作多系統啟動U盤&#xff0c; 但是我按照網上說的步驟&#xff0c;總是不能制作成功&#xff1a; 1. 格式化…

[轉載] JAVA基礎----java中E,T,?的區別?

batch_size 1 layout "NHWC" target tvm.target.Target("cuda") dtype "float32" log_file "%s-%s-B%d.json" % (network, layout, batch_size)

用MATLAB結合四種方法搜尋羅馬尼亞度假問題

選修了cs的AI課&#xff0c;開始有點不適應&#xff0c;只能用matlab硬著頭皮上了&#xff0c;不過matlab代碼全網僅此一份&#xff0c;倒有點小自豪。 一、練習題目 分別用寬度優先、深度優先、貪婪算法和 A*算法求解“羅馬利亞度假問題”。具體地圖我這里不給出了&#xff0c…

[轉載] Java中文與ASCII碼的轉換

參考鏈接&#xff1a; 擴展Java中的原始轉換 今天在研究Java中編碼的時候&#xff0c;看到了Java中ascii碼的強大。寫了一個CoderUtils.java&#xff0c;以后會擴展它。 package com.xingxd.study.test; import java.io.File; import java.io.FileWriter; import java.io.I…

[轉]Paul Adams:為社交設計

為社交設計 Strong, Weak, and Temporary Ties by Paul Adams on 2010/04/09 PS&#xff1a;作者Paul Adams Facebook全球品牌體驗總監 電話和手機聚集十億用戶用了15年的時間&#xff0c;而Facebook只用了9個月。我們看到越來越多的人開始用在線社交網絡&#xff0c;這種網絡好…

[轉載] Java中日期格式轉換

參考鏈接&#xff1a; Java中的類型轉換和示例 Code: /** * 字符串轉換為java.util.Date<br> * 支持格式為 yyyy.MM.dd G at hh:mm:ss z 如 2002-1-1 AD at 22:10:59 PSD<br> * yy/MM/dd HH:mm:ss 如 2002/1/1 17:55:00<br> * yy/MM/dd HH:…

Android Framework中的Application Framework層介紹

Android的四層架構相比大家都很清楚&#xff0c;老生常談的說一下分別為&#xff1a; Linux2.6內核層&#xff0c;核心庫層&#xff0c;應用框架層&#xff0c;應用層。我今天重點介紹一下應用框架層Framework。 Framework層為我們開發應用程序提供了非常多的API&#xff0c;我…

[轉載] java注釋

參考鏈接&#xff1a; Java注釋 Java注釋 java中注釋有三種&#xff1a;這些都稱之為java doc標記&#xff0c;含義如下&#xff1a; java中注釋有三種&#xff1a; 單行注釋 //注釋的內容&#xff0c;多行注釋 /…注釋的內容…/&#xff0c;文檔注釋 /**…注釋的內容….*/。…

環路是怎樣形成的實例

環路是怎樣形成的一個由十多臺交換機組成的小型局域網&#xff0c;交換機大多是Cisco的中低端系列產品。某日突然出現問題&#xff1a;局域網內的主機之間相互ping時&#xff0c;都出現延時長、丟包現象&#xff0c;網絡應用奇慢無比。 觀察交換機設備&#xff0c;指示燈看不出…

[轉載] 《Python語言程序設計》課程筆記

參考鏈接&#xff1a; Python程式設計語言 文章目錄 第一部分 Python快速入門第1周 Python基本語法元素第2周 Python基本圖形繪制 第二部分 Python基礎語法第3周 基本數據類型3.1 數字類型及操作3.3 字符串類型及操作3.4 模塊2: time庫的使用 第4周 程序的控制結構4.1 程序的分…

ORACLE中創建如何創建表,并設置結構和默認值

使用select語句查看EMP表&#xff0c;根據COMM排序 默認情況下&#xff0c;空值會自動排列在尾部。 利用nulls last排序時將空值置底 利用nulls first排序時將空值置頂 例 創建一張出版社表 使用語句 create table 表名&#xff08;列名1 類型&#xff0c;列名2 類型&#xff0…

[轉載] C++靈魂所在之---多態的前世與今生

參考鏈接&#xff1a; Java是否支持goto 開頭先送大家一句話吧&#xff1a; 眾所周知&#xff0c;在20世紀80年代早期&#xff0c;C在貝爾實驗室誕生了&#xff0c;這是一門面向對象的語言&#xff0c;但它又不是全新的面向對象的語言&#xff0c;它是在傳統的語言…