当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Intellij警告"串联中的StringBuffer.toString()"》经验,为你挑选了1个好方法。

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

StringBuilder sb = new StringBuilder("Two");
String s = "One" + sb.toString();

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



1> manouti..:

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".

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有