【问题标题】:String & StringBuffer classes in relation to append() method与 append() 方法相关的 String 和 StringBuffer 类
【发布时间】:2014-12-12 02:50:59
【问题描述】:

我引用了 Herbert Schildt 关于 Java 的书,字符串处理章节,

append( ) 方法最常在 + 运算符用于 String 对象时调用。 Java 自动将对 String 实例的修改更改为对 字符串缓冲区实例。因此,串联会在 StringBuffer 对象上调用 append( )

我很清楚串联会在 StringBuffer 实例上调用 append( )。作者所说的“+ 运算符在 String 对象上使用时最常调用方法”是什么意思?据我了解,'append()' 不能与字符串一起使用。

在执行连接之后,编译器插入一个对toString( )的调用来转 可修改的 StringBuffer 变回一个常量 String。这一切似乎都不合理 复杂的。为什么不只拥有一个字符串类并让它的行为或多或少像 字符串缓冲区?答案是性能。 Java 运行了许多优化 时间可以让我们知道 String 对象是不可变的。值得庆幸的是,Java 隐藏了大部分 Strings 和 StringBuffers 之间转换的复杂性。其实很多程序员 永远不会觉得需要直接使用 StringBuffer 并且能够表达大多数操作 就字符串变量的 + 运算符而言。

我想知道知道 String 对象是不可变的,Java 运行时可以进行哪些优化?

详细说明代码总能让我更好地理解上述问题吗?

【问题讨论】:

  • Java 编译器会将 + 替换为 StringBuffer(实际上现在是 StringBuilder)并调用 append。
  • 他是否想说这样的话 String s1; s1 = sb.append("a = ").append(a).append("!").toString();
  • 编译器会用类似的东西替换String s1 = "a = " + a + "!";;是的。

标签: java string append stringbuffer


【解决方案1】:

我想知道知道 String 对象是不可变的,Java 运行时可以进行哪些优化?

对于初学者来说,这里有字符串池——程序中的任何字符串文字都将被保留;引用相同内容的字符串字面量的不同类只会引用内存中的同一个对象。

在更疯狂的新闻中,最近版本的 Java 垃圾收集器中有一个 option,在某些条件下,垃圾收集器会检测到多个具有相同内容的 String 对象并编辑它们以指向相同的支持 @ 987654323@。这仅是可能的,因为字符串是不可变的,并且允许垃圾收集器静默(并且保持语义)减少内存消耗。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2014-01-08
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多