java中,String可以说是一种比较特殊的对象。他是将不同的字符串存放起来,当你定义一个字符串变量时,则把
相应的字符串的地址付给你的变量,咱们姑且把这些不同字符串存放的位置称为字符串的池
String testString 1= "a";
这样的声明实际上是声名了一个变量testString1 指向一个字符串常量“a”,这个对象是String类型的一个实例,来自于上面提到的字符串池
这时如果你再定义一个String变量
String testString2 = "a";
这时,你会发现testString 1与 testString2 内存地址是相同的,因为"a"这个字符串是共享的
testString2 = "a" + 1
这时,你实际改变的是 testString2 指向的地址,java虚拟机重新创造了一个字符串常量"a1"并将地址传递给 testString2 ,而不是改变字符串所对应的内容
也就是说如果你这样声名
String str1 = "a";
String str2 = str1;
str2 = str1 + "1";
这时,str1的内容仍将是"a",而str2的内容是"a1"
String str = "a";
String str1 =str + "1";
String str2 = str + "1";
这时,str1与str2 的内存地址是不相同的,因为对于变量的 + 和subString操作,结果是不共享的,也就是说不放在字符串池中。也就不可能地址相等
字符串更应改作为常量使用,因为字符串本身是采用字符的拼接来实现的,如果字符串更改,则会创建一个新的字符串,这个字符串使用原有的字符进行拼接,所以说多用字符串的共享特性,少用更改,能够节省资源
这也是在多次更改时,使用StringBuffer的原因。
绝对原创,欢迎大家留言指正,如果转载,请注明,谢谢大家!