java-为什么String要设计成不可变的?

2018-09-03  本文已影响28人  凯玲之恋

1 字符串常量池的需要

如下面的代码所示,将会在堆内存中只创建一个实际String对象.

String s1 = "abcd";  

String s2 ="abcd";  
4017096-27f6655d358c18d7.jpg

请思考: 假若代码如下所示,s1和s2还会指向同一个实际的String对象吗?

String s1= "ab" + "cd";  

String s2="abc" + "d";  

也许这个问题违反新手的直觉, 但是考虑到现代编译器会进行常规的优化, 所以他们都会指向常量池中的同一个对象. 或者,你可以用 jd-gui 之类的工具查看一下编译后的class文件.

2 允许String对象缓存HashCode

3 安全性

假如有如下的代码:

boolean connect(string s){  

if (!isSecure(s)) {   

throw new SecurityException();   

}  

// 如果在其他地方可以修改String,那么此处就会引起各种预料不到的问题/错误   

    causeProblem(s);  

}

总体来说, String不可变的原因包括 设计考虑,效率优化问题,以及安全性这三大方面. 事实上,这也是Java面试中的许多 "为什么" 的答案。

参考

为什么String要设计成不可变的?

上一篇下一篇

猜你喜欢

热点阅读