您的位置:首页 > 编程语言 > Java开发

Java中String为什么是final或immutable

2014-09-29 11:20 603 查看
原文链接:http://javarevisited.blogspot.com/2010/10/why-string-is-immutable-in-java.html   

这是一个在Java面试中经常会被问及的问题,这个问题一般是由类似这样的讨论引出:什么是String?Java中的String与c/c++中有什么差别?甚至会问Java中immutable object是指什么?immutable object有什么好处?为什么要用它以及在什么样的场景下需要用它?这与为什么String是final是同一个问题。也许这个问题有很多答案,但只有String的设计者才能正确的回答这个问题,但我想至少有以下几方面:

1)假设String池中的String不是immutable,但是这一点也不可能,如果字符串“Test”被很多变量引用,只要任何一个变量改变了字符串的值,其他的变量都会自动收到影响。

String A="Test";

String B="Test";

现在字符串B调用"Test".toUpperCase()将变量转换成大写"TEST", 这样A也就变成了“TEST”,但这其实并不是我们想要的。

2)String也被广泛的作为Java Class Method的参数,比如打开网络连接时传递主机名和端口号作为参数,传递数据库URL用于连接数据库,也可以在打开文件时传递文件名给Java的I/O class。

在这些情况下,如果String不是immutable,会带来严重的安全问题,假设一个人对其授权访问的文件,改变了文件名并重新获了文件访问权限,但是因为String是immutable,你就不需要担心这种情况。这也可以解释为啥String 是final的,final string保证了任何人都不能重写String而改变String的行为。

3)immutable String也保证了可以在多线程间共享,这对多线程很重要并可以避免Java中的同步问题。immutable也保证了String instance的安全性,也即你不用同步String上的操作,然而也应该注意到substring可能会引起Java中memory
leak,尽管这不是一个线程安全相关的问题。

4)另外一个原因就是可以缓存String的hashcode,因为是immutable,一旦hashcode被缓存,就不会重新计算,这使得String作为key的hashmap效率很高。简而言之,因为String是immutable,一旦创建没有人可以改变它的内容,这保证了String hashcode在多次方法调用之后依然保持不变。

5)另外一个比较好的原因是class 加载机制, immutable String是class安全加载的基础,如果String是mutable,一个加载'java.io.writer’的请求可以被篡改成加载"mil.vogoon.DiskErasingWriter“。

    安全和String池是String设计为immutable的首要原因,但我相信也有其他令人确信的原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: