Java run和debug在StringBuffer中名为append()的方法中有不同的结果

Java run和debug在StringBuffer中名为append()的方法中有不同的结果,java,debugging,debuggervisualizer,Java,Debugging,Debuggervisualizer,在图片的代码中,我将得到不同的结果 第一种情况,运行代码,打印是111222 第二种情况,调试代码,打印是111 我还发现了源代码中的一个问题 从上图中,我们可以发现表达式toStringCache=nullexecute不成功 请告诉我这个问题的原因 谢谢 运行打印 ** 调试打印 PS:在jdk7中,它没有toStringCache属性,结果是相同的。 但是,在jdk8或更高版本中,结果是不同的。最后,我发现了Intelij IDEA导致的问题。在Eclipse中运行的代码具有相同的打

在图片的代码中,我将得到不同的结果

第一种情况,运行代码,打印是111222

第二种情况,调试代码,打印是111

我还发现了源代码中的一个问题

从上图中,我们可以发现表达式
toStringCache=null
execute不成功

请告诉我这个问题的原因

谢谢

运行打印 **

调试打印

PS:在jdk7中,它没有
toStringCache
属性,结果是相同的。
但是,在jdk8或更高版本中,结果是不同的。

最后,我发现了Intelij IDEA导致的问题。在Eclipse中运行的代码具有相同的打印格式。 怎么了

StringBuffer的
实例发生更改时,其私有ArtAttribute
toStringCache
将被分配为null

但是在Intelij IDEA中,它不会被赋值为null(但是,到目前为止我不知道原因,可能是一个bug)

当我们打印s时,它将调用方法
toString()
,它将检查
toStringCache
是否为空。如果
toStringCache
为空,将从父类私有属性
value
生成一个新值,然后返回
toStringCache

下面是关于
StringBuffer中
append(stringstr)
toString()
的源代码

  @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);
    }

您正在两个不同的地方调试-为什么要进入
StringBuilder::append
?我要进入StringBuilder::append?不是StringBuffer::append吗?对不起,
StringBuffer
-顺便说一句,这是不推荐的,不是it@ScaryWombat不完全是这样,最好使用
StringBuilder
。JavaDoc声明使用单个线程时,
StringBuilder
会更快,因为它不使用同步。是的,但我想知道为什么结果不同