Intellij警告"串联中的StringBuffer.toString()"

Kli*_*cou 3 java string stringbuilder intellij-idea intellij-14

如果您在"性能问题"标题下启用所有检查,则会收到有关以下代码的警告(如标题中所示):

StringBuilder sb = new StringBuilder("Two");
String s = "One" + sb.toString();
Run Code Online (Sandbox Code Playgroud)

我意识到这toString()是不必要的,但它在哪个方面是性能问题?

man*_*uti 5

StringBuilder如果你打算使用字符串连接operator(+)来创建一个StringBuilder幕后,导致创建两个StringBuilder对象而不是一个对象,那么使用a是没有意义的.您可以简单地重用StringBuilder连接字符串:

StringBuilder sb = new StringBuilder("One");
sb.append("Two");
String s = sb.toString();
Run Code Online (Sandbox Code Playgroud)

原始代码相当于:

StringBuilder sb = new StringBuilder("Two");
StringBuilder sb2 = new StringBuilder("One");
String s = sb2.append(sb.toString()).toString();
Run Code Online (Sandbox Code Playgroud)

与警告相关的另一个方面(诚然与性能而不是代码优化有关)是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".