作者:知乎用户
链接:https://www.zhihu.com/question/31345592/answer/114259286
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
存在即合理。所以我们想想不变比可变好在哪里?
1、线程安全。基本类型传值对象传引用,记住这一点。既然传引用,两个变量就有可能指向同一个String。而在String可变情况下,我要是通过一个变量来更改String,那么另一个变量取到的String也就变了!为什么?因为两个变量指向同个String。试想在多线程里,这会是多么可怕的一件事情:一个线程正在处理一个String,发现自己处理的String竟然变了。惊了?!shenmegui?!而且,因为多线程由CPU调度的关系,你难以确定到底这个可变的String会变成shenmegui。啥?你说封装在线程安全的类里?直接让他不可变多省事。
2、小明写了个方法:
String method(String origin){
origin += origin.substring(2);
return origin;
}
然后他将同个字符串分别传入两次并打印:
Shenmeguienmegui
Shenmeguienmeguienmeguienmegui
小明惊了?!随即他发现,因为String是可变的,而第一次调用就已经改变了原来的字符串。所以……
String method(String origin){
String result = origin.clone();
result += result.substring(2);
return result;
}
一边骂着Moon的工程师干嘛不让字符串不可变,小明终于得到了他要的输出:Shenmeguienmegui
Shenmeguienmegui