int x int y和int x,y有什么区别

时间:2020-08-22 19:10:49

标签: java

之间:

int x;
int y;

和:

int x, y;

例如,在下面的代码中:

public static boolean sda4(int[] arr) {
    for(int i=0, j=arr.length/2; i<arr.length/2 && j<arr.length; i++, j++)
        if(arr[i]!=arr[j]) return false;
    return true;
}

如果我在for循环(int i=0, int j=arr.length/2)中键入内容,则会显示“语法错误”。

3 个答案:

答案 0 :(得分:2)

字节码术语没有区别。

  • 使用多个变量声明,您可以保存一些行,并且它们都属于同一数据类型,因此更易于阅读。两种情况下保留的内存空间都是相同的。

  • 使用声明和变量的多次初始化,尽管可以节省行并且代码更紧凑,但阅读起来可能更复杂或烦人。

因此,有时代码更紧凑并不意味着它具有更高的质量。

GL


答案 1 :(得分:1)

让我们做一点实验吧?我们将仔细研究三个不同的程序。

Test1.java

public class Test1 {
    public static void main(String[] args) {
        int x;
        x = 1;
        int y;
        y = 2;
        System.out.println(x);
        System.out.println(y);
    }
}

Test2.java

public class Test2 {
    public static void main(String[] args) {
        int x = 1, y = 2;
        System.out.println(x);
        System.out.println(y);
    }
}

Test3.java

public class Test3 {
    public static void main(String[] args) {
        int x;
        int y;
        x = 1;
        y = 2;
        System.out.println(x);
        System.out.println(y);
    }
}

现在我们编译这三个程序(javac Test1.java Test2.java Test3.java)并查看生成的字节码(javap -C Test[123])时,我们将看到以下内容:

javap -c Test1

Compiled from "Test1.java"
public class Test1 {
  public Test1();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
       7: iload_1
       8: invokevirtual #13                 // Method java/io/PrintStream.println:(I)V
      11: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
      14: iload_2
      15: invokevirtual #13                 // Method java/io/PrintStream.println:(I)V
      18: return
}

javap -c Test2

Compiled from "Test2.java"
public class Test2 {
  public Test2();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
       7: iload_1
       8: invokevirtual #13                 // Method java/io/PrintStream.println:(I)V
      11: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
      14: iload_2
      15: invokevirtual #13                 // Method java/io/PrintStream.println:(I)V
      18: return
}

javap -c Test3

Compiled from "Test3.java"
public class Test3 {
  public Test3();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
       7: iload_1
       8: invokevirtual #13                 // Method java/io/PrintStream.println:(I)V
      11: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
      14: iload_2
      15: invokevirtual #13                 // Method java/io/PrintStream.println:(I)V
      18: return
}

由于所有三个类的字节码都相同,因此问题是个人喜好之一。在Java中,通常每个变量都在其自己的行上运行。 Braian Coronel discussed some pros and cons wrt. code readability in his answer

答案 2 :(得分:0)

像这样修正您的代码, 在j = arr.length / 2之前删除'int' 因为您不能在for循环条件中声明多个变量类型。因为int x,y是您可以在循环条件内创建变量的唯一一件事

public static boolean sda4(int[] arr) {
        for(int i=0, j=arr.length/2; i<arr.length/2 && j<arr.length; i++, j++)
            if(arr[i]!=arr[j]) return false;
        return true;
    }