• Java 值传递与引用传递


     @Test
        public void testChangeStudents() {
            List<Student> students = new ArrayList<Student>() {{
                add(Student.builder().age(50).build());
                add(Student.builder().age(100).build());
            }};
            filterStudent1(students);
            //结果不变 因为改变的是传给filterStudent1的新的引用指向
            System.out.println(ObjectMapperUtils.toJSON(students));
            filterStudent2(students);
            System.out.println(ObjectMapperUtils.toJSON(students));
            changeStudents(students);
            System.out.println(ObjectMapperUtils.toJSON(students));
        }
    
        private void filterStudent1(List<Student> students) {
            //传入这里的students 是从对象上复制出来的一个地址,和调用方不是一个引用;改变这个引用的指向不会影响调用方持用的引用
            students = students.stream()
                    .filter(student -> student.getAge() > 50)
                    .collect(Collectors.toList());
        }
    
        private void filterStudent2(List<Student> students) {
            //但如果改变了引用的地址上对象的内容,则会影响对象。传入这里的引用和调用方持有的引用因为是同一个对象,所以调用方也看到了对象的变化
            students.remove(0);
        }
    
        private void changeStudents(List<Student> students) {
            //change 同理
            students.forEach(s -> s.setAge(s.getAge() + 1));
        }
    
        @Test
        public void testChangePeople() {
            Student s = Student.builder()
                    .age(1L)
                    .addr("xx")
                    .build();
            changePeople(s);
            System.out.println(s.getAge());
        }
    
        private void changePeople(Student s) {
            s.setAge(100L);
        }
    
  • 相关阅读:
    Codeforces 754A Lesha and array splitting (搜索)
    浅入分析Linux
    MakeFile基本使用
    Mac 安装YCM
    Homebrew 配置
    虚拟机复制操作CentOS6导致eth0转为eth0以至于网络服务启动失败的解决方案
    Kickstart安装
    Linux编译安装MySQL
    Python源码读后小结
    编译原理小结
  • 原文地址:https://www.cnblogs.com/greatLong/p/16379104.html
Copyright © 2020-2023  润新知