String类的源代码如下:
/** The value is used for character storage. */
private final char value[];
首先你要明白,字符串的本质是一个字符数组。
value属性用来存放字符串中的字符,是一个final属性,即:不可被修改的属性。
所以,每当你要改变这个字符串的值时,都会在原来字符串的基础上产生一个新的字符串。
原来的字符串保持不变。即你说的:如果要改变则需要先断开原有的对象引用,再开辟新的对象,之后再指向新的对象空间.
各个原始字符串可以想象成存放在公共的储存池中,比如说"a","b",在储存池里面是独立的单元,而字符串"ab"相当于将这"a","b"的储存单元共享,并且在内存中单独开辟了一个空间来储存"ab"这个字符串.可以理解为C语言的指针.新开辟出来的空间储存的是指向"a","b"的地址.所以一旦对"ab"进行任何修改,那么内存单元需要重新开辟.例如现在"ab"变成"aba",那么"aba"的内存地址就和"ab"不一样了
声明一个String类型的对象之后,就会在相应栈内存中给你开辟一块控件来存储你声明的对象,但是你现在还没有使用,也就是指针还没有指向它;如果你要改变就需要开辟新的一块内存控件来存储你声明的对象,给你个例子吧
String a=1;
String b=2;
String a=3;
b=a;
System.out.println(b);
你可以去试试到最后输出的结果是什么?
例如:String s = "abc";s这个变量的指针是指向"abc"这个字符串在内存中的首地址,执行s = "d"的时候,s所指向的内存地址发生了变化,已经不是指向"abc"的首地址,而是把"d"存在内存中,把s的指针指向了"d"的地址