Java 方法从FindBugs调用新的String()构造函数
提前感谢您的帮助,因为我对编码非常陌生,目前正在测试一些我所学的新代码Java 方法从FindBugs调用新的String()构造函数,java,encoding,netbeans-8,Java,Encoding,Netbeans 8,提前感谢您的帮助,因为我对编码非常陌生,目前正在测试一些我所学的新代码 public static void main(String[] args) { // TODO code application logic here String x = new String(); String y = new String(); int x1; int y1; System.out.println("Welcome"); System.
public static void main(String[] args) {
// TODO code application logic here
String x = new String();
String y = new String();
int x1;
int y1;
System.out.println("Welcome");
System.out.println("Enter x prediction");
Scanner scanstr = new Scanner (System.in);
Scanner scanint = new Scanner (System.in);
x = scanstr.nextLine();
System.out.println("Enter y prediction");
y = scanstr.nextLine();
当我针对这段代码运行FindBugs时,我得到(对于字符串“x”和“y”):
方法调用无效的新字符串()构造函数
使用无参数构造函数创建新的java.lang.String对象会浪费内存,因为这样创建的对象在功能上与空字符串常量无法区分“.Java保证相同的字符串常量将由相同的字符串对象表示。因此,您应该直接使用空字符串常量
我知道我可以直接将x声明为“String x”,而不使用“new String()”,但是有没有其他方法可以在不使用“new String()”的情况下优化代码呢?基本上有三种编写代码的方法: 您的版本:
String x = new String();
FindBugs
String x = "";
最有效的版本2:
您还可以移动声明,以便将最后一个版本编写为:
String x = scanner.nextLine();
其他版本最有可能是第一个版本的衍生版本,效率更低。(它们可能会阻止FindBugs
抱怨,但这是个坏主意。)
有没有其他方法可以在不删除“new String()”的情况下优化代码
不,见上文
FindBugs
的要点是使用String()
构造函数效率低下,而且在几乎所有情况下都不需要它
不必要地初始化局部变量也可能是低效的,而且(IMO)对可读性肯定是有害的。但是,new String()
的成本远远大于不必要的初始化成本
(可能需要使用new String()
的唯一情况是,您的应用程序故意实现为依赖String
对象标识(例如,您使用=
来比较字符串),并且需要有多个不同的String
实例“长度为零的字符串”“。我很难想到您希望在其中执行此操作的实际应用程序。)
1-FindBugs正在推荐一种替代方案。它不是“告诉你”去做某事。您应该记住,来自FindBugs等工具的建议通常基于简单的启发式,并不总是最佳解决方案
2-我应该对此进行限定。有可能。。。甚至有可能。。。JIT编译器将注意到此初始化是不必要的,并且不会发出任何本机代码指令来执行此操作。这将使争论变得毫无意义。事实上,JIT编译器甚至有可能对第一个版本执行类似的优化。。。因为它可能知道
String()
构造函数没有副作用。但是请注意,这些优化仅适用于不需要初始化的情况。不允许JIT编译器将新字符串()
优化为“”
。。。因为它们实际上意味着不同的东西。感谢各位的回复和澄清。我更改了代码'String x;'在运行FindBugs以阻止它抱怨之后,希望确保它是高效的。我还将尝试“String x=scanner.nextLine();”看看我的整个代码是如何工作的
再次感谢,我感谢你们的回应
String x = scanner.nextLine();