修改非不可变对象,java

lir*_*iro -5 java stringbuilder substring

我对这个例子感到困惑:

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
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么ch = e并且它不会创建异常?

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

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

Moh*_*uag 5

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