顶果子。原因是从c那边的编程习惯学习过来的习惯吧。。c里面将==误写, if(anyway = null )不会报错, 在java里面除非null是boolean误写了编译不过: 查了一下,另外有个习惯: String b = null; "constant".equals(b); // result to false b.equals("constant"); // NullPointerException b != null && b.equals("constant"); // result to false
呃,说错了上面,如果是null,java里面错写肯定编译不过啊。
这个是编程习惯的问题。写左边的话牺牲了部分可读性(不过如果大家都这么干的话就无所谓了),但是可以避免 a = NULL 这样的把比较误写成赋值的错误。
null写左边主要是来防止你在输入==时少打了个等号变成赋值。
null写在左边 马上就会报错。
写在右边 编译不会出错的。甚至有时运行都不出运行错误,只是在程序的逻辑上出错了,结果当然错了。
这样的错误很难查找。
所以写在左边是个好习惯。
一般字符串常量写左边,判断null的左右都无所谓
String str = null;
System.out.println(str != null);
}
} 0: aconst_null
1: astore_1
2: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
5: aload_1
6: ifnull 13
9: iconst_1
10: goto 14
13: iconst_0
14: invokevirtual #3; //Method java/io/PrintStream.println:(Z)V
17: returnpublic class Test { public static void main(String[] args) {
String str = null;
System.out.println(null != str);
}
} 0: aconst_null
1: astore_1
2: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
5: aconst_null
6: aload_1
7: if_acmpeq 14
10: iconst_1
11: goto 15
14: iconst_0
15: invokevirtual #3; //Method java/io/PrintStream.println:(Z)V
18: return根据 javap 反编译的指令,后者仅比前者多了一条指令。JVM 中直接有 ifnull 指令来判断某一个对象是否为空,如果使用 null != str 的话,就无法使用到这个指令,这时 JVM 会采用 if_acmpeq 也就是比较 null 常量值引用与 str 的引用是否相同。这也仅仅是 JVM 指令上的差别,对于执行效率来说没有差别。
在java里面除非null是boolean误写了编译不过:
查了一下,另外有个习惯:
String b = null;
"constant".equals(b); // result to false
b.equals("constant"); // NullPointerException
b != null && b.equals("constant"); // result to false
呃,说错了上面,如果是null,java里面错写肯定编译不过啊。
所以效率还是有所差别的