为什么String对象是不可变的

字符串池的需要

String Pool是Java heap中一中比较特殊的存储空间。当创建一个已经在String pool中存在的字符串时,返回值为已存在字符串的引用。这两语句在堆中只生成了一个string 对象。

String string1 = "abcd";
String string2 = "abcd";
http://www.programcreek.com/wp-content/uploads/2013/07/java-string-pool.jpeg
如果字符串非 immutable,则同一个 String 对象的不同应用值中有一个对该string 对象进行了改变之后,则另一对象的引用也随之被修改了。

Allow String to cache its Hascode

字符串的hascode在Java中是比较常用的,例如:HashMap。将String class设计为immutable可以保证hascode保持一致,以此在缓存时不会担忧指定的字符串被更改。这意味着:每次使用hascode时不必进行运算对比。整体上提高了程序的运行效率。

安全

字符串的应用非常广泛。其一就是在很多类中充当参数的角色。例如:网络连接network connection、打开文件opening file,,,如果string可以随意更改,一个文件打开或者网络连接就会被改变,带来了极大的安全隐患。String对象作为参数的一个重要应用还有一个场景:把database URL作为一个字符串,以此进行数据库的连接。

Summarize

以上这些答案包含了设计、效率以及安全方面。这篇文章总计自一篇博文:http://java.dzone.com/articles/why-string-immutable-java算是一篇译文吧。

你可能感兴趣的:(为什么String对象是不可变的)