Java forEach对原数组的操作过程

 更新时间:2024年02月07日 10:52:54   作者:chishuiLi  
forEach对于基本数据类型,是直接赋值,对于引用数据类型,是引用地址值,forEach遍历时,是创建的临时变量,引用的数据地址,本文给大家介绍Java forEach对原数组的操作过程,感兴趣的朋友一起看看吧

forEach

总结
forEach对于基本数据类型,是直接赋值,对于引用数据类型,是引用地址值。

  • 对于基本数据类型,forEach不能修改原数组的值。
  • .对于引用数据类型:String,forEach也不能修改原数组的值,因为String是不可变的。
  • 对于其他引用类型(不被final修饰),forEach能修改具体的属性,因为forEach是地址引用。

forEach遍历时,是创建的临时变量,引用的数据地址。
对于基本数据类型,int,char,double等,这些值在forEach中进行遍历操作时,是不能修改的。

@Test
    public void testInt(){
        int[] arr = new int[]{1,2,3,4,5};
        //使用foreach遍历arr数组
        for(int i : arr){
            //如果i=2,那么就将i值变为0
            if(i == 2){
                i = 0;
            }
        }
        //遍历数组
        for(int i : arr){
            System.out.print(i + " ");
        }

对于以上代码,我们预期输出是1 0 3 4 5,但是实际输出是1 2 3 4 5

forEach在遍历基本数据类型是,相当于是创建了一个临时变量i,我们相对数组元素的修改,实际上都是修改的i值,并不会影响原数据
对于引用数据类型:
特殊:String类:
对于String类,也是不能修改的,因为String是被final修饰,是不可变的。

 	@Test
    public void testString(){
        String[] strAll = new String[]{"aa","bb","cc"};
        for(String str : strAll){
            if("bb".equals(str)){
                str = "xx";
            }
        }
        for(String str : strAll){
            System.out.print(str + " ");
        }
    }

对于以上代码,我们预期输出是 aa xx cc ,但是实际输出确实 aa bb cc

开始时内存空间解析:

后面str依次指向aa bb cc

当指向bb时,他想修改其中的值,但是String是不能被修改的,所以他只能重新去创建一个1,但是原数组的指向并没变。,所以最后遍历踹的原数组值也是不会改变的。

对于其他引用类:
例如StringBuilder:
需要注意的是,StringBuilder并没有重写equals()方法,所以在进行equals比较时,只能转化成String来比较。

@Test
    public void testStringBuilder(){
        StringBuilder[] strBul = new StringBuilder[]{new StringBuilder("111"), new StringBuilder("222"), new StringBuilder("333")};
        for(StringBuilder s : strBul){
            //StringBuilder并没有重写equals,所以如果直接调用的话,它是比较的地址值。
            if("222".equals(s.toString())){
                s.append("aaa");
            }
        }
        for(StringBuilder s : strBul){
            System.out.println(s);
        }

预期输出和实际输出都是 111 222aaa 333

我们自己定义的类:

public class TestForeach {
    Person[] pArr = new Person[]{new Person("张三",18),new Person("李四",20),new Person("王六",10)};
    public void foreachTestPerson(){
        for(Person p : pArr){
            if("王六".equals(p.name)){
                p.age = 100;
            }
        }
        for(Person p : pArr){
            System.out.println(p);
        }
    }
    public static void main(String[] args) {
        new TestForeach().foreachTestPerson();
    }
}
class Person{
    public String name;
    public int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", id=" + age +
                '}';
    }
}

特别需要注意:StringBuilder和StringBuffer都是没有重写equals()方法的,不要直接用equals比较!
内存解析:
开始时:

修改后,原数组的地址时没有变的,所以能修改成功。

到此这篇关于Java forEach对原数组的操作过程的文章就介绍到这了,更多相关java foreach数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot实现验证码登录

    Springboot实现验证码登录

    这篇文章主要为大家详细介绍了Springboot实现验证码登录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Spring Boot异常处理try-catch应该怎么使用?

    Spring Boot异常处理try-catch应该怎么使用?

    这篇文章详细介绍了Web系统中异常处理的重要性,以及SpringMVC的异常处理机制,解释了异常在系统中的角色,讨论了Java异常模型的关键认知,包括Throwable体系结构和异常传播,强调了在Web系统中不应该到处使用try-catch,而是应该在边界层统一处理异常
    2026-01-01
  • Spring Cloud Config配置文件使用对称加密的方法

    Spring Cloud Config配置文件使用对称加密的方法

    Spring Cloud Config提供了两种加密解密方式,一种是对称加密,一种是非对称加密。这篇文章将先展示如何使用对称加密。感兴趣的朋友跟随脚步之家小编一起学习吧
    2018-05-05
  • LangChain4j 集成 SpringBoot的项目实践

    LangChain4j 集成 SpringBoot的项目实践

    本文主要介绍了LangChain4j 集成 SpringBoot的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • java打印国际象棋棋盘的方法

    java打印国际象棋棋盘的方法

    这篇文章主要为大家详细介绍了java打印出国际象棋棋盘的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 模拟简单Java线程池的方法详解

    模拟简单Java线程池的方法详解

    这篇文章主要为大家详细介绍了模拟简单Java线程池的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Spring Boot邮箱链接注册验证及注册流程

    Spring Boot邮箱链接注册验证及注册流程

    这篇文章给大家介绍Spring Boot邮箱链接注册验证问题及注册流程分析,通过实例代码给大家分享实现过程,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Java常见异常全面梳理(含分类+含义+典型场景)

    Java常见异常全面梳理(含分类+含义+典型场景)

    异常是指程序在执行过程中,出现的非正常情况,可能由程序员错误、系统错误或用户输入错误引起,下面这篇文章主要介绍了Java常见异常全面梳理的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-03-03
  • 浅谈一下Java中的ReentrantLock

    浅谈一下Java中的ReentrantLock

    这篇文章主要介绍了浅谈一下Java中的ReentrantLock,这个类是JUC工具包中对线程安全问题提供的一种解决方案,它主要是用来给对象上锁,保证同一时间这能有一个线程在访问当前对象,需要的朋友可以参考下
    2023-09-09
  • 解决@Validated对List对象验证失效问题

    解决@Validated对List对象验证失效问题

    文章指出@Validated注解无法验证List数组参数,建议手动逐项验证或封装List为对象进行验证,前者代码冗余但直接,后者需调整JSON结构但更简洁,根据需求选择方案,权衡灵活性与参数改造成本
    2025-09-09

最新评论