之间:
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)
中键入内容,则会显示“语法错误”。
答案 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;
}