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