正如我被告知这是Java中重要的字符串访问问题,它首先讨论“什么是字符串”,如何在java中的字符串与C或C ++不同,然后你被问及不可变对象,你就是问了一个主要问题:“为什么String是Java中的不可变或最终的”。
你能分享你的想法吗?
提前致谢。
答案 0 :(得分:27)
主要是出于安全原因。字符串在网络连接,数据库URL等中用作参数。如果它是可变的,它很容易被攻击
String
的不变性解决了一些同步问题,它使String
线程安全
支持 StringPool 设施
缓存 hashcode
String
支持类加载机制,其中String
用作参数。字符串是可变的导致错误的类被加载
答案 1 :(得分:8)
字符串在许多现代语言(包括Java)中不可变的两个主要原因是安全性和性能(或者更准确地说,是优化的机会)。
字符串为final
的事实是为了确保它们的不变性(禁止任何人扩展它们并使它们再次变得可变)。
答案 2 :(得分:8)
最重要的原因是安全性。
如果恶意线程可以获得对可变String的引用,则会出现很多安全风险,该String将被传递到必须在执行重要操作之前验证String的方法。线程在验证后可以更改字符串,然后使用危险的字符串执行操作。
为什么String在Java中是不可变的另一个原因是允许String缓存其哈希码
如上所述 - 最重要的原因 - 安全&线程安全性。
考虑一个场景,在用于汇款的银行应用程序中 - 受益人帐号在字符串中定义为“0789567345”。 如果错误/故意这个acc。号码被更改,钱将转到错误的帐户。
另一种情况 - 如果有人在处理之间的任何地方更改了类名...
getClass().getName().subString(0, 5);
类加载器只会说'找不到类