细思极恐的 String 不可变属性

2017-10-05  本文已影响4人  比特舞者

今天偶然看到 String 的源码,总结一下 String 不可变性。有些事情就是这样,就像自行车,几乎大家天天骑,但是知道自行车原理的人却很少。

要谈 String 类的不可变性,需要谈到变量的“引用”和“值”

下面是个人的理解,引用是保存变量值的地址.
例如,abcd 是 s 的值,指向值“abcd”地址的别称

来自知乎

所以,只要值为“abc”的 String 变的引用都是相同的。也就是说

String str1 = "abc";
String str2 = "abc";
str1 == str2 // true
//
String str1 = "abc";
String str2 = new String("abc");
str1 == str2 // false 
//
String str1 = new String("abc");
String str2 = new String("abc");
str1 == str2 // false 

根据“引用”的性质,出现了上面不同的玩法。

自己想象出来的模型

和“引用”性质相关的是函数的传值方式。Java 中函数的变量不是传的值,而是引用。所以在函数中是不能将传过来的 String 类型的值改变的。
例如

public String appendStr(String str){
   str += "bbb";
   return str ;
}
String a = new String("aaa")
appendStr(a)
System.out.println(a);// 结果是 aaa
大概就是这样吧

参考http://www.cnblogs.com/xiaoxi/p/6036701.html
这篇文章将 String 的不可变性、类中成员变量编译运行、final 属性、JVM 内存模型等结合在一起,将 String 类型的不可变性的各种情况说透。
文章中应该还缺少一些编译、运行的过程说明。

上一篇 下一篇

猜你喜欢

热点阅读