【问题标题】:Why storing the StringBuffer object returned by the replace() method is not required?为什么不需要存储 replace() 方法返回的 StringBuffer 对象?
【发布时间】:2017-07-24 18:46:38
【问题描述】:
class replaceDemo {
    public static void main(String args[]) {
        StringBuffer sb = new StringBuffer("This is a test.");

        sb.replace(5, 7, "was");
        System.out.println("After replace: " + sb);
   }
}

replace() 方法返回一个 StringBuffer 对象,那么为什么该行是 不是这样的:

sb = sb.replace(5, 7, "was");

为什么不需要存储replace()返回的对象?

【问题讨论】:

标签: java string stringbuffer


【解决方案1】:

StringBuffer可变的,而突变是方法replace副作用

另一方面,StringBuffer 有一个 fluent API 允许“调用链”:

String test = new StringBuffer().append("some").append(" odd string").replace(5,8,"even").toString();

相当于:

StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("some");
stringBuffer.append(" odd string");
stringBuffer.replace(5, 8, "even");
String test = stringBuffer.toString();

【讨论】:

  • “方法链”,这就是通常的名称(只是一个信息)。
  • @Tom “方法链”是 上个世纪的... ;o)
【解决方案2】:

StringBuffer 用于表示可以修改的字符。

replace 操作对 StringBuffer 中存储为 char[] 的字符进行操作,并仅返回当前实例。

所以调用 sb = sb.replace(5, 7, "was") 类似于只调用 sb.replace(5, 7, "was")

【讨论】:

    【解决方案3】:

    这不是必需的,因为replace() 返回的是当前对象,而不是新对象的副本。

    函数的行为是对当前对象进行操作,不创建新对象。

    返回:

    这个对象。

    注意不是新对象,也不是对象的副本,而是操作完成后的当前对象。

    https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html#replace(int,%20int,%20java.lang.String)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 2019-10-29
      • 2012-04-23
      • 2019-04-13
      相关资源
      最近更新 更多