Java run和debug在StringBuffer中名为append()的方法中有不同的结果
在图片的代码中,我将得到不同的结果 第一种情况,运行代码,打印是111222 第二种情况,调试代码,打印是111 我还发现了源代码中的一个问题 从上图中,我们可以发现表达式Java run和debug在StringBuffer中名为append()的方法中有不同的结果,java,debugging,debuggervisualizer,Java,Debugging,Debuggervisualizer,在图片的代码中,我将得到不同的结果 第一种情况,运行代码,打印是111222 第二种情况,调试代码,打印是111 我还发现了源代码中的一个问题 从上图中,我们可以发现表达式toStringCache=nullexecute不成功 请告诉我这个问题的原因 谢谢 运行打印 ** 调试打印 PS:在jdk7中,它没有toStringCache属性,结果是相同的。 但是,在jdk8或更高版本中,结果是不同的。最后,我发现了Intelij IDEA导致的问题。在Eclipse中运行的代码具有相同的打
toStringCache=null
execute不成功
请告诉我这个问题的原因
谢谢
运行打印
**
调试打印
PS:在jdk7中,它没有toStringCache
属性,结果是相同的。
但是,在jdk8或更高版本中,结果是不同的。最后,我发现了Intelij IDEA导致的问题。在Eclipse中运行的代码具有相同的打印格式。 怎么了 当
StringBuffer的
实例发生更改时,其私有ArtAttributetoStringCache
将被分配为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
会更快,因为它不使用同步。是的,但我想知道为什么结果不同