我来自 Herbert Schildt 一书 Java , 章节字符串处理< / EM> ,
在String对象上使用
append( )
运算符时,最常调用+
方法。 Java会自动将对String实例的修改更改为类似的操作 StringBuffer实例。因此,连接在StringBuffer对象上调用append( )
。
我非常清楚串联在StringBuffer实例上调用append( )
。作者的意思是说&#34; append( )
方法通常在+
运算符用于String对象时被调用&#34;?根据我的理解&#39;追加()&#39;不能与字符串一起使用。
执行连接后,编译器会插入对
toString( )
的调用以进行转换 可修改的StringBuffer返回一个常量String。所有这一切似乎都是不合理的 复杂。为什么不只是有一个字符串类,并使其行为或多或少 StringBuffer的?答案是表现。 Java运行有许多优化 时间可以让人知道String对象是不可变的。值得庆幸的是,Java隐藏了大部分内容 字符串和StringBuffers之间转换的复杂性。实际上,很多程序员 永远不会觉得需要直接使用StringBuffer,并且能够表达大多数操作 就字符串变量的+运算符而言。
我想知道Java运行时知道String对象是不可变的优化是什么?
使用代码进行阐述总能让我更好地理解上述问题?
答案 0 :(得分:2)
我想知道Java运行时知道String对象是不可变的优化是什么?
对于初学者来说,有字符串池 - 程序中的任何字符串文字都将被实现;两个引用具有相同内容的字符串文字的不同类将仅引用内存中的同一对象。
在更疯狂的消息中,Java垃圾收集器的最新版本中有option,在某些情况下,垃圾收集器将检测具有相同内容的多个String
对象并进行编辑他们指向相同的支持char[]
。这是唯一可能的,因为字符串是不可变的,并且允许垃圾收集器静默(并且保持语义)减少内存消耗。