【问题标题】:Modify non immutable object, java修改非不可变对象,java
【发布时间】:2016-04-01 16:00:53
【问题描述】:

我对这个例子感到困惑:

StringBuilder a = new StringBuilder("abcde");
String subStr = a.substring( a.indexOf("a") , a.indexOf("c")  );
int leng = a.length();
char ch = a.charAt(4);
System.out.println( subStr + " " + leng + " " + ch);
//the result will be : subStr = abc  , leng = 5  ch = e

我的问题是:为什么 ch = e 并没有创建异常?

我的想法:
我有一个 StringBuilder,一个非不可变对象,如果我在对象上使用方法,它将返回具有相同引用对象的对象的新值。

  • 为什么当我使用a.substring ( int a, int b ) 时,它没有修改对象 StringBuilder ?
  • 为什么如果我使用方法a.append("value")我正在修改StringBuilder对象的值?

【问题讨论】:

标签: java substring stringbuilder


【解决方案1】:

我有一个 StringBuilder,一个非不可变对象,如果我在对象上使用一种方法,它将返回具有相同引用对象的对象的新值。

  • 方法并不总是会返回相同的引用对象。它可能会创建一个新对象并返回它。在你做任何事情之前检查docs总是更好。

为什么当我使用a.substring ( int a, int b )时,它没有修改对象StringBuilder

  • 如果您阅读documentation,它清楚地表明substring(int,int) 方法返回一个新字符串。这回答了为什么您的对象没有被修改。

如果我使用a.append("value") 方法,为什么我要修改StringBuilder 对象的值?

  • 如果您再次阅读docs 中的append(String),它会清楚地说明它 - 返回:对此对象的引用。。此方法符合“你的想法”

【讨论】:

    【解决方案2】:

    仅仅因为一个对象是“可变的”并不意味着对象可以执行的每个方法都必须修改它。常见的例子是 equals(), getClass() ... append() 但是确实修改了 StringBuilder 对象。

    【讨论】:

      【解决方案3】:

      为什么当我使用 a.substring ( int a, int b ) 它没有修改 对象 StringBuilder ?

      因为substring()返回一个新字符串,它不会修改StringBuilder

      char ch = a.charAt(4);,charAt()根据索引返回一个字符,由于索引是零基,它返回e

      【讨论】:

        【解决方案4】:

        .substring() 方法返回一个 String 对象,它不会修改StringBuilder 本身。

        【讨论】:

        • 我想就是这样。该行是char c = a.charAt(4); 那是原始的“abcde”StringBuilder,而不是subStr
        • 我认为 OP 对为什么 .substring() 方法没有修改 StringBuilder 内容感到困惑,因为他期望 ch 字符有不同的输出。
        猜你喜欢
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        • 2022-01-26
        • 2020-11-10
        • 1970-01-01
        • 2020-12-12
        • 1970-01-01
        • 2012-07-16
        相关资源
        最近更新 更多