问题描述
StringBuilder a = new StringBuilder("abc");
StringBuilder b = a.append("de");
b = b.append("f").append("g");
System.out.println("a=" + a);
System.out.println("b=" + b);
为什么a &b 的输出是一样的?
解决方法
让我把行StringBuilder b = a.append("de");
这里的 a.append("de")
表示
a = a + "de"
。 ie a = "abcde"
然后StringBuilder b = a.append("de") = a;
现在 StringBuilder b
和 a
具有相同的引用。
为避免此问题,您必须为 StringBuilder
创建一个新的 b
对象。
我认为这就是您要找的:
StringBuilder a = new StringBuilder("abc");
StringBuilder b = new StringBuilder(a.append("de"));
b = b.append("f").append("g");
System.out.println("a=" + a);
System.out.println("b=" + b);
现在输出为:
a=abcde
b=abcdefg
在您的情况下,'b' 也只是对 'a' 的引用。这意味着 'a' 和 'b' 引用同一个对象。一个方面的任何变化都会反映在另一个方面。
,在第 2 行中,当您说 "StringBuilder b = a.append("de")" 时,您实际上是将它们链接在一起。所以,他们两个在这一点上是一样的。当您执行 a.append("de") 时,该行有 2 个函数。一种是在StringBuilder a 中添加“de”。第二种是将 StringBuilder b 设置为 String builder a。因此,由于它们都设置为相同的内容,因此结果相同。
,StringBuilder 不是不可变的。它只是为了方便而返回自身的一个实例,以便您可以链接方法。所以 a
和 b
指的是这里显示的同一个实例。
StringBuilder a = new StringBuilder("abc");
StringBuilder b = a.append("de");
b = b.append("f").append("g");
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("a = " + System.identityHashCode(a));
System.out.println("b = " + System.identityHashCode(b));
System.out.println(a == b);
印刷品
a=abcdefg
b=abcdefg
a = 925858445
b = 925858445
true