运行和调试在StringBuffer中名为append()的方法中有不同的结果

时间:2018-08-13 02:36:48

标签: java debugging debuggervisualizer

StringBufferTest

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

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

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

StringBuffer

我也在源代码中发现了一个问题。

从上图可以发现表达式toStringCache = null执行失败。

请告诉我有关此问题的原因。

谢谢。

运行打印

result1 **

调试打印

result2

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

1 个答案:

答案 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);
    }