[转载] 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.mzph.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;它是在传统的语言…