字符串的不可变性
在了解字符串的不可变性之前 我们先要了解String对象 以及 String字符串在内存中存储的位置
查看String源码看到String两个成员变量 一个value[] 另一个是hash :
当我们运行下面代码
String str1 = "abcd";
String str2 = new String("abcd");
String str3 = "abcd";
System.out.println(str1 == str2);
System.out.println(str1 == str3);
运行结果为:
false
ture
此时我们观察它们在内存中的布局
被双引号引起来的字符串通常都会放在常量池中,如果常量池中有,就会使用常量池中的
那String为什么不可变呢
有的说String类是被final修饰的,被final修饰的类我们说这种类是不能被继承的
也有的说是String类中的成员变量value数组是被final修饰的
分析下面代码
String str1 = new String("abcd");
当我们定义了一个Sting类型的str1变量的时候,
查看String的构造方法发现
它把字符串的value以数组的形式给了当前对象str1的value了,
而value 是被final修饰的数组,说明value 只能引用当前的对象
那我们能不能通过value 去修改指向对象的值呢? 答案是可以. 但是value 也是被private 修饰的!!!,
也就是说是被封装的,
那被封装的我们可以使用提供的get set方法啊
但是 纵观String类的所有方法,没有发现String有get set 方法,
所以你不能改变String的值
所以字符串它是不可变的.