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数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot2.1 RESTful API项目脚手架(种子)项目

    SpringBoot2.1 RESTful API项目脚手架(种子)项目

    这篇文章主要介绍了SpringBoot2.1 RESTful API项目脚手架(种子)项目,用于搭建RESTful API工程的脚手架,只需三分钟你就可以开始编写业务代码,不再烦恼于构建项目与风格统一,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 浅谈Java利用表格模型创建表格

    浅谈Java利用表格模型创建表格

    这篇文章主要介绍了Java利用表格模型创建表格,需要的朋友可以参考下
    2017-09-09
  • 教你通过B+Tree平衡多叉树理解InnoDB引擎的聚集和非聚集索引

    教你通过B+Tree平衡多叉树理解InnoDB引擎的聚集和非聚集索引

    大家都知道B+Tree是从二叉树演化而来,在这之前我们来先了解二叉树、平衡二叉树、平衡多叉树,这篇文章主要介绍了通过B+Tree平衡多叉树理解InnoDB引擎的聚集和非聚集索引,需要的朋友可以参考下
    2022-01-01
  • SpringBoot基于redis自定义注解实现后端接口防重复提交校验

    SpringBoot基于redis自定义注解实现后端接口防重复提交校验

    本文主要介绍了SpringBoot基于redis自定义注解实现后端接口防重复提交校验,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • spring.profiles.active配置使用小结

    spring.profiles.active配置使用小结

    spring.profiles.active 配置使得应用程序能够在不同的环境中使用不同的配置,本文主要介绍了spring.profiles.active配置使用小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Java实现定时任务的示例代码

    Java实现定时任务的示例代码

    这篇文章主要为大家详细介绍了Java实现定时任务的相关知识,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-11-11
  • SpringAop @Around执行两次的原因及解决

    SpringAop @Around执行两次的原因及解决

    这篇文章主要介绍了SpringAop @Around执行两次的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java连接SqlServer错误的完美解决方法

    Java连接SqlServer错误的完美解决方法

    我们在做Java或者C#连接数据库的时候,常常遇到连接SqlServer失败的问题,明明检查了好几遍代码没问题了,还是连接不上,下面这篇文章主要给大家介绍了关于Java连接SqlServer错误的完美解决方法,需要的朋友可以参考下
    2023-04-04
  • Java实现把图片处理到指定大小的操作方法

    Java实现把图片处理到指定大小的操作方法

    项目开发中,经常遇到图片上传功能,发现如果图片比较大时,在查看、预览、下载速度会特别慢,考虑到浪费流量以及文件服务器的存储空间,决定在后端优化处理完再上传,所以本文给大家介绍了使用Java把图片处理到指定大小的操作方法,需要的朋友可以参考下
    2025-03-03
  • mybatis-plus @select动态查询方式

    mybatis-plus @select动态查询方式

    这篇文章主要介绍了mybatis-plus @select动态查询方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论