Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法从FindBugs调用新的String()构造函数_Java_Encoding_Netbeans 8 - Fatal编程技术网

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();