想必每一位Java学习者对String都很熟悉,但是对于String的底层是否了解就不一定了。
下面大家看到面试题:
package com.string.exer;
public class StringTest {
String str = new String("good");
char[] ch = {'t', 'e', 's', 't'};
public void change(String str, char[] ch) {
str = "test ok";
ch[0] = 'b';
}
public static void main(String[] args) {
StringTest st = new StringTest();
st.change(st.str, st.ch);
System.out.println(st.str);
System.out.println(st.ch);
}
}
问:输出的是什么?
运行结果如下:
为什么输出的是good、best,而不是test ok、test ?
解析:字符串和数组都是引用类型,在值传递都传递的是地址值,所以当在change方法中修改ch[0]的值时,其实就是对属性
ch[] 数组的修改。但是,在change方法中并不能通过修改形参str的值,进而修改属性str的值,因为字符串是不可变的 ,而数
组是可变的。对于change方法中“str = “test ok” ”,此时形参str的确是指向属性str的地址值,但是由于字符串的不可变性,在执行
此语句时,并不会更改属性str指向的String对象的value值,而是在字符串常量池创建字符串“test ok”,然后把"test ok"的地址值赋
给形参str。