1、String不可变是因为保存串值的数组是final修饰的(Jvm 有专门的字符串常量池用于存放字符串,存放字符串的数据结构是HashTable),所以String不可变
2、final修饰的数组元素值为什么还能被改变?
因为下面代码final修饰的是对象,final 修饰对象时,只是引用不可变!(即栈内保存的数组对象地址不会被改变,但是指向堆内的对象身上的值任然可以改变)
public static void main(String[] args) { String str = new String("world"); final 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){ str = "change"; arr[0] = 'a'; arr[1] = 'b'; arr[2] = 'c'; arr[3] = 'd'; arr[4] = 'e'; } |
答案: world abcde |