如果您在"性能问题"标题下启用所有检查,则会收到有关以下代码的警告(如标题中所示):
StringBuilder sb = new StringBuilder("Two"); String s = "One" + sb.toString();
我意识到这toString()
是不必要的,但它在哪个方面是性能问题?
StringBuilder
如果你打算使用字符串连接operator(+
)来创建一个StringBuilder
幕后,导致创建两个StringBuilder
对象而不是一个对象,那么使用a是没有意义的.您可以简单地重用StringBuilder
连接字符串:
StringBuilder sb = new StringBuilder("One"); sb.append("Two"); String s = sb.toString();
原始代码相当于:
StringBuilder sb = new StringBuilder("Two"); StringBuilder sb2 = new StringBuilder("One"); String s = sb2.append(sb.toString()).toString();
与警告相关的另一个方面(诚然与性能而不是代码优化有关)是toString()
与+
操作数一起使用时是冗余的.这是因为编译器会自动调用toString()
.这是您在问题中已经猜到的内容,并在Java语言规范中进行了解释:
(来自https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18.1):
如果只有一个操作数表达式是类型
String
,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串.
其中部分5.1.11说:
如果引用
null
,它被转换成字符串"null"
(4个ASCII字符n
,u
,l
,l
).否则,执行转换就好像通过调用
toString
没有参数的引用对象的方法一样; 但是如果调用toString
方法的结果是null
,则使用字符串"null"
.