我看到很多第三方开源代码中都有下面类似的代码:
1.public static boolean isNumeric(String str) {
2. if (str == null) {
3. return false;
4. }
5. int sz = str.length();
6. for (int i = 0; i < sz; i++) {
7. if (Character.isDigit(str.charAt(i)) == false) {
8. return false;
9. }
10. }
11. return true;
12. }
我想问的就是 if (Character.isDigit(str.charAt(i)) == false), 为什么很多代码判断 true 还是 false的时候都用 "== false" 的形式,而不写成 if (!Character.isDigit(str.charAt(i))) {...} 的形式,两者具体有什么区别?
java代码是有compile变成class,然后在jvm里面运行的
[code="java"]
public class CompileDemo {
public void demo() {
if (isDigit() == false) {
}
}
public void demo2() {
if (!isDigit()) {
}
}
public boolean isDigit() {
return true;
}
}
[/code]
编译以后,用javap -l -s -v CompileDemo,可以看出
[code="java"]
public void demo();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokevirtual #2; //Method isDigit:()Z
4: ifne 7
7: return
public void demo2();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokevirtual #2; //Method isDigit:()Z
4: ifne 7
7: return
[/code]
这2个方法其实是一模一样的。
(Character.isDigit(str.charAt(i)) == false)与(!Character.isDigit(str.charAt(i)))就是代码可读性的问题了。。。我自己也觉得前者更易读一些
没什么区别。程序员水平或习惯问题。"== false"比较直观,但没有必要,不这样写性能会好一点点,但这一点性能忽略不记,无关紧要。
从运算结果上来说呢,没有什么区别。在这里有一个编程的习惯。
但是编程的时候,你常常会有某种不可预知的失误,把“==”写成了“=”,那么编译器不会报错,因为编译器会认为这是一个赋值运算,而不是布尔运算。这个是高手经验得来的结果。
好的代码就是让程序更加结实而已。
[quote]你常常会有某种不可预知的失误,把“==”写成了“=”,那么编译器不会报错[/quote]
能否解释的更清楚一点,什么情况下把“==”写成了“=”,编译器不会报错
[quote]
能否解释的更清楚一点,什么情况下把“==”写成了“=”,编译器不会报错
[/quote]
C和C++才会这样,JAVA是会报错的.
其实作用是一样的,只能可读性提高了。
我就不习惯使用boolean==false。
因为如果你是这样子写
boolean v = Character.isDigit(str.charAt(i));
if(v==false){}
被误写成if(v=false)那就麻烦了
我刚才看了一下源码,用的是common-lang.2.3.jar版本。直接写的。
public static boolean isNumeric(String str)
{
if(str == null)
return false;
int sz = str.length();
for(int i = 0; i < sz; i++)
if(!Character.isDigit(str.charAt(i)))
return false;
return true;
}
2.3中的确是是楼主说的,我刚才那个是反编译的,没有看到。
public static boolean isNumeric(String str) {
if (str == null) {
return false;
}
int sz = str.length();
for (int i = 0; i < sz; i++) {
if (Character.isDigit(str.charAt(i)) == false) {
return false;
}
}
return true;
}