理解Java中的for-each循环:为什么有时候不能修改数组元素?

news2024/9/21 4:26:40

前言:

      刚开始学习编程的时候,我们都会老老实实用 for-i循环,后面接触到for-each的时候,发现竟然还可以再省一点代码,慢慢也会开始学会用for-each。但其实,在有些即使是需要从头遍历的场景,for-each也并不能替代for-i循环,例如修改遍历基本数据类型的数组元素。 


目录

一、分析数组类型:int[ ] 

二、分析数组类型:String[ ]

三、分析StringBuilder[ ]类型,有时可以改 

四、归纳总结:


一、分析数组类型:int[ ] 

public static void main(String[] args) {
        int[] numbers = new int[5];

        System.out.print("修改前:");
        //用for-each遍历输出,看看原数组
        for (int number : numbers) {
            System.out.print(number);
        }

        //用for-each遍历修改
        for (int number : numbers) {
           number=1;
        }
        System.out.println();
        System.out.print("修改后:");
        //用for-each遍历输出,看看修改结果
        for (int number : numbers) {
            System.out.print(number);
        }

如图所示,修改失败。

原因: 

当我们在for-each循环中遍历数组时,循环体中的变量(如上例中的number实际上只是数组元素的一个副本而不是对原数组元素的引用。只是把number这个局部变量的值改了,

循环体中的变量是一个局部变量,它的生命周期仅限于一次循环迭代。

 为什么for-i行? 

 number[i] 通过索引访问的是数组中的实际元素的引用,修改它就会改变原数组中的数据。


二、分析数组类型:String[ ]

原因: 

      在 for-each 循环中,循环变量 tmp 只是一个指向数组元素的局部引用。对 tmp 重新赋值只会改变 tmp 自身的指向,并不会修改数组中实际元素的引用,因此数组内容保持不变。


三、分析StringBuilder[ ]类型,有时可以改 

原因: 

   append 方法可以修改 StringBuilder 对象的内容,因为 StringBuilder 是可变对象,append 直接改变对象的内部状态

         而 = 赋值仅改变了 tmp 变量的引用,指向了新的对象,不会影响原数组中的 StringBuilder 对象,因此无法修改数组中的内容。


四、归纳总结: 

1.针对基本数据类型:int[] 和其他基本数据类型的数组(如 byte[], char[], float[] 等)都具有相似的特性。在这些数组中,for-each`循环只会遍历元素的副本,而不是数组元素的引用,使用 for-each循环进行修改都不会影响原数组的内容。

2.针对引用类型:针对引用类型的数组,for-each`循环提供的是一个局部变量该变量是数组中元素引用的拷贝

- 如果在循环中使用 `=` 操作符,只会改变这个局部变量指向的对象引用,而不会影响原数组中的引用。

- 只有通过对这个对象调用方法,或者直接修改对象的属性(如 `TreeNode.next`),才能真正影响到原数组中的元素。

就像我们做一些链表Oj,题中链表头结点为head

我们让cur=head;

再让cur=null;

并不会影响原链表。

但是我们让cur=head;

再让cur.next=null;

就影响到了原链表了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uva455 输入格式说的不明白多加空格

提要:题目你看原题有输出格式的坑,本来已经写好代码 结果被这**格式整半天才好!! 那个xuhanx是我错了那么多次主打一个锲而不舍笑死我了。简单讲一下核心代码就一行 x[j] ! pattern[j % i] 这个是原理比较好理解吧。 建议就是…

SpringBoot和Redis的交互数据操作 以及 Redis的持久化/删除策略和缓存问题

一、SpringBoot和Redis/MySQL的数据交互 说明: 在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce SpringBoot/Spring和Redis之间的交互简称为Spring-data-redis,有两种方式提供选择: jedis :采用的直连,多个…

一个专门用于Java服务端图片合成的工具,支持图片、文本、矩形等多种素材的合成,功能丰富强大(附源码)

前言 在数字化营销的当下,企业对于图片处理的需求日益增长。然而,传统的图片处理方式往往需要复杂的操作和专业的技术,这不仅增加了工作量,也提高了时间成本。 为了处理这一问题,一款能够简化图片合成流程的软件应运…

《书生大模型实战营第3期》进阶岛 第4关: InternVL 多模态模型部署微调实践

文章大纲 写在前面(什么是InternVL)InternVL 模型总览Dynamic High ResolutionPixel ShuffleInternVL 部署微调实践准备InternVL模型准备环境准备微调数据集InternVL 推理部署攻略使用pipeline进行推理推理后 InternVL 微调攻略准备数据集配置微调参数开…

中年程序员从西安出发到日照、青岛低成本吃喝万里行,暑假遛娃自由行:连云港-日照-青岛 6天5 晚自由行

文章大纲 暑假出行总体方案Day1 西安-连云港:连岛Day2 连云港-日照:海鲜蒸汽锅Day3 日照 :海洋馆Day4 日照-青岛:再游金沙滩Day5 青岛:山涧溪谷Day6 青岛-连云港-西安 暑假出行总体方案 今年出去玩的地方不算少&#…

Java中VM options与Program arguments区别与作用

Java中VM options与Program arguments区别与作用 VM options 我们在程序中需要的运行时环境变量,它需要以-D或-X或-XX开头,每个参数使用空格分隔 使用最多的就是-Dkeyvalue设定系统属性值,比如-Dserver.port8088 application.yml server:…

深度优先搜索:如何在二叉树中找出“好节点”【迭代法、状态管理技巧、DFS】

一、题目分析 题目要求: 给定一棵二叉树,定义一个“好节点”为:从根节点到该节点路径上,没有任何节点的值比该节点的值大。要求我们返回二叉树中好节点的数量。 示例: 示例 1: 输入: [3,1,4,3,null,1,5] 输出: 4解…

Open3D 遍历八叉树

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2数据显示 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概…

Git安装包及怎么再windows上运行

第一步:下载git。 国内 Git for Windows. 国内镜像 感谢GitHub - waylau/git-for-win: Git for Windows. 国内直接从官网下载比较困难,需要翻墙。这里提供一个国内的下载站,方便网友下载 安装步骤: Git for Windows安装和基本…

VTK—vtkCutter截取平面数据

, 本例 vtkCutter可以配合隐式函数截取数据使用vtkPlane隐式函数配合vtkWidget截取任意平面。 1.读入数据 Create(vtkMultiBlockPLOT3DReader, reader);reader->SetXYZFileName("G:/Temp/vtkTest/combxyz.bin");reader->SetQFileName("G:/Tem…

Linux系统之部署轻量级Markdown文本编辑器

Linux系统之部署轻量级Markdown文本编辑器 一、项目介绍1.1 项目简介1.2 使用方法 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源 四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看ap…

【题目/训练】:双指针

引言 我们已经在这篇博客【算法/学习】双指针-CSDN博客里面讲了双指针、二分等的相关知识。 现在我们来做一些训练吧 经典例题 1. 移动零 思路: 使用 0 当做这个中间点,把不等于 0(注意题目没说不能有负数)的放到中间点的左边,等于 0 的…

微服务设计原则——高性能:存储设计

文章目录 1.读写分离2.分库分表3.动静分离4.冷热分离5.重写轻读6.数据异构参考文献 任何一个系统,从单机到分布式,从前端到后台,功能和逻辑各不相同,但干的只有两件事:读和写。而每个系统的业务特性可能都不一样&#…

STM32CubeMX生成stm32MP135中断优先级配置错误修正方法

0 修改方法 使用STM32CubeMX生成stm32MP135代码的中断优先级配置错误,将导致所有中断优先级设置不对。 如果设置EXTI0中断优先级为10,在STM32CubeMX中配置如下: 生成的中断优先级配置代码为: 正确写法应该将中断优先级左移3位&…

python人工智能001:NumPy科学计算库说明与安装

1. NumPy说明 NumPy(Numerical Python)是Python的一个开源数值计算扩展库。它提供了一个强大的N维数组对象ndarray,以及用于对这些数组进行操作的函数。NumPy的数组和数组操作是Python数据分析、机器学习、科学计算等领域的基础。 NumPy的主…

web开发环境搭配与创建javaee项目

一.web开发 (1)web开发指的是前端,后端,以及数据库进行交互,前端发送请求到后端,后端经过程序处理后到达数据库,最后在进行后端处理响应回前端。 (2)一次三端交互的doget或者dopost简单请求流程 (3)web开发除了需要前端,后端,数据库开发工具…

Java之线程篇一

目录 如何理解进程? 进程和线程的区别 线程的优点 线程的缺点 线程异常 线程用途 创建线程 方法一:继承Thread类,重写run() 观察线程 小结 方法二: 实现Runnable接口,重写run() 方法三:继承Threa…

超越AnimateAnyone!Meta提出全身 3D虚拟人技术ExAvatar,可通过简短视频克隆人像并转化为3D数字形象

ExAvatar是由DGIST和Meta公司的Codec Avatars Lab联合研发的一项技术,能够通过捕捉视频中的动作和表情,转化为栩栩如生的3D数字形象。这项技术解决了以往技术中的难题,提高了动画的自然度和渲染效果。 什么是 ExAvatar? ExAvatar 是全新富有表现力的全身 3D 高斯化身。 结…

2.1 文件内容差异对比方法

2.1 文件内容差异对比方法 文件内容差异对比方法2.1.1 两个字符串的差异对比2.1.2 生成美观的HTML格式文档2.1.3 对比nginx 配置文件差异代码封装 文件内容差异对比方法 介绍如何通过difflib模块实现文件内容差异对比。difflib作为Python的标准库模块无需安装,作用…

算法学习——树形DP——多叉树的最长路径

文章目录 引言正文0、题目的具体内容1、树的直径定理推导3、使用数组链表表示树使用数组表示链表数组表示单链表头插法演示数组表示单链表在索引k出插入一个数字数组表示链表实现代码链表表示树 4、树形DP的具体分析 总结 引言 这个问题,每一次都会痛击我&#xff…