StringBuilder 子字符串错误行为

joh*_*ohn 1 java

public class Demo234234 {

    public static void main(String[] args) {
        
        String s = "aa";
        StringBuilder sb = new StringBuilder(s);
        System.out.println(sb);
        
        sb.append("bb");
        System.out.println(sb);
        
        sb.substring(s.length());
        System.out.println(sb); // Here I expected as "bb", but getting "aabb", why?
        System.out.println(sb.substring(s.length()));
        
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

aa
aabb
aabb
bb
Run Code Online (Sandbox Code Playgroud)

我期望该行的输出为“bb” System.out.println(sb);,但结果却为“aabb”,可能知道为什么吗?

sb.append("bb");行为正确,那为什么不呢sb.substring(s.length());

还有一件事要问:哪个更好用?stringObj.substring() 还是 stringBuilder.substring() ??

Ser*_*nov 5

在 a 中,StringBuildersubstring(int start)方法返回一个新值String,但不会更改StringBuilder对象本身,因此您应该将其结果保存到 类型的变量中String

String ss = sb.substring(s.length());
System.out.println(ss);
Run Code Online (Sandbox Code Playgroud)