String引用传递问题 为何打印出来的str仍为world?


    public static void main(String[] args) {
        String str = new String("world");
        char[] ch = new char[]{'h','e','l','l','o'};
        change(str,ch);
        System.out.println(str);
        System.out.println(String.valueOf(ch));
    }

    public static void change(String str, char[] arr){//s地址值拷贝传递
        str = "change";
        arr[0] = 'a';
        arr[1] = 'b';
        arr[2] = 'c';
        arr[3] = 'd';
        arr[4] = 'e';
    }

打印结果为world,abcde
请教,为何str的值没有被替换为change?

https://blog.csdn.net/weixin_43030796/article/details/81974190
字符串是一个特殊的数据类型,它的底层是一个final 型的ch[]数组,属于无法更改,所以字符串在作为参数传递时,可以当做一个特殊的数组进行操作,同样的它也是将复制一份原本的对象引用给了副本,此时副本对象的引用和原本对象的引用都指向原始字符串的位置,也就是s1和在刚开始初始化时它指向的地址和原对象s指向的位置一致,即s1的初始hashcode值和原对象s的hashcode值一样,s1经过s1=“change”操作后,由于字符串的不可变性,此时会s1一个新的对象引用,即此时s1指向“change”的位置。s1的hashcode值会变化,但是原本s它的对象引用没有发生改变,并且“aaa”也未发生改变,所以s任然指向”world”。

你只是改变了形参里的str,main函数的还是 world
对象也是值传递,只是把这个对象的引用copy了一份

str的值在change方法中没有被改变,只改变了char[] ch的值,所以打印出来的str依然是world