为什么允许创建字符串的多个副本时,他们是不可变的?



在Java中,我可以创建与新操作符相同值的多个String。
但是因为字符串是不可变的。允许多个String的意义是什么。
为什么不把用new操作符创建的对象也保存在String池中以节省内存呢?

是语言行为的一致性。new运算符总是生成一个新对象。没有例外。

是否每次调用new操作符时都需要创建一个新的String实例,即使相同的String已经存在?不是真的。但另一种选择是必须绕过整个构造函数机制,以便在创建新实例之前检查某种对象池。

这样的对象池要么必须是仅针对String类的特殊异常,要么必须以某种方式在类级别上可定义(某种特殊的构造函数)。由于额外的复杂性,这两种方法都是相对不可取的。

就目前而言,String常量池和String实习提供了足够的保护,以防止数百万个重复的String对象,没有的给语言带来了大量额外的复杂性。

最新更新