在图片的代码中,我会得到不同的结果。
第一种情况,运行代码,打印为111222。
第二种情况,调试代码,打印为111。
我也在源代码中发现了一个问题。
从上图可以发现表达式toStringCache = null
执行失败。
请告诉我有关此问题的原因。
谢谢。
PS:在jdk7中,没有toStringCache
属性的结果是相同的。
但是,在jdk8或更高版本中,结果是不同的。
答案 0 :(得分:0)
最后,我发现了由Intelij IDEA引起的问题。在Eclipse中运行的代码具有相同的打印效果。 怎么了?
StringBuffer's
实例更改后,其私有属性toStringCache
将分配为null。
但是在Intelij IDEA中,它不会被分配为null。(但是,到目前为止,我仍然不知道原因,也许是一个错误。)
当我们打印s时,它将调用方法toString()
,它将检查toStringCache
是否为空。如果toStringCache
为null,将从父类的私有属性value
生成一个新值。然后返回toStringCache
。
以下是append(String str)
中toString()
,StringBuffer
的源代码
@Override
@HotSpotIntrinsicCandidate
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
@Override
@HotSpotIntrinsicCandidate
public synchronized String toString() {
if (toStringCache == null) {
return toStringCache =
isLatin1() ? StringLatin1.newString(value, 0, count)
: StringUTF16.newString(value, 0, count);
}
return new String(toStringCache);
}