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);
    }
posted @ 2022-06-15 17:04  lllunaticer  阅读(78)  评论(0)    收藏  举报