在java中检查String / Object的空值?

时间:2016-03-03 08:04:57

标签: java performance null

拥有

有什么好处
String a = null;
if(null != a)

if(a !=null)

我尝试了两种说法并且工作正常。有什么建议我为什么要选择第一个呢?

5 个答案:

答案 0 :(得分:4)

两者都是相同的,但是如果你在布尔值上检查==

if(a == true)

VS

if(true == a)

后者会更好,因为只有键入=而不是==才会出现排印错误:

if(a = true) //still compilable but not what you intended
if(true = a) //cannot be compiled, hence you know you typed it wrongly

答案 1 :(得分:1)

首先对项目提出质疑听起来更自然。

在英语中你会说,"如果答案是正确的,请检查"。你不会说,"如果答案是正确的"。人们以他们思考和说话的方式编码。

切换订单(我很清楚)的唯一有效用例是您调用equals()的地方,但您正在测试的对象可能为空。在这种情况下,它可以更清洁

if ("expected".equals(value))

大于

if (value != null && value.equals("expected"))

答案 2 :(得分:1)

优势: 将常量值放在表达式中不会更改程序的行为(除非值计算为false)。在使用单个等号(=)进行赋值而不进行比较的编程语言中,可能的错误是无意中分配值而不是编写条件语句。

<强>性能: 对绩效没有影响

可读性:降低了

缺点避免空行为的优点也可以被认为是一个缺点,因为空指针错误可以被隐藏,并且只会在程序中稍后出现。

答案 3 :(得分:0)

嗯,除了(缺乏)可读性之外什么都没有。

此外,它仅适用于布尔类型:

boolean b = true;
if (b) {
    System.out.println("b, it is"); // << this
} else {
    System.out.println("not b");
}

让我们破解:

boolean b = false;
if (b = true) {
    System.out.println("b, it is"); // << this
} else {
    System.out.println("not b");
}

其他方式:

boolean b = true;
if (b = false) {
    System.out.println("b, it is");
} else {
    System.out.println("not b"); // << this
}

但是使用int:

int a = 5;
if(a = 0) { // error: incompatible types: int cannot be converted to boolean
    System.out.println("0");
} else {
    System.out.println("not 0");
}

在您的示例中,使用String和a = null表达式也是如此。因此,虽然这个Yoda Comparison在C中很有用,但它在Java中没用。

答案 4 :(得分:0)

似乎存在 微小 的差异。 使用JMH,在SecureRandom测试和随机测试之间似乎有微小的差别。在我看来,差异并不显着。

Benchmark                                                        Mode  Samples  Score  Score error   Units
c.g.v.YodaCompPerformace.countNullsArrayList                    thrpt      200  1.345        0.009  ops/ms
c.g.v.YodaCompPerformace.countNullsArrayListSecureRandom        thrpt      200  1.349        0.008  ops/ms
c.g.v.YodaCompPerformace.countNullsArrayListSecureRandomYoda    thrpt      200  1.358        0.009  ops/ms
c.g.v.YodaCompPerformace.countNullsArrayListYoda                thrpt      200  1.361        0.009  ops/ms

JHM代码:

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;

@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Thread)
public class YodaCompPerformace {

    static List<Integer> arrayListSecureRandom;
    static List<Integer> arrayListRandom;

    @Setup(Level.Iteration)
    public void setUpSecureRandom() {
        arrayListSecureRandom = new ArrayList<>(100000);
        for (int count = 0; count < 100000; count++) {
            if ((count & 1) == 0) {
                arrayListSecureRandom.add(count);
            } else {
                arrayListSecureRandom.add(null);
            }
        }
        Collections.shuffle(arrayListSecureRandom, new SecureRandom());
    }

    @Setup(Level.Iteration)
    public void setUp() {
        arrayListRandom = new ArrayList<>(100000);
        for (int count = 0; count < 100000; count++) {
            if ((count & 1) == 0) {
                arrayListRandom.add(count);
            } else {
                arrayListRandom.add(null);
            }
        }
        Collections.shuffle(arrayListRandom, new Random());
    }
    @Benchmark
    public int countNullsArrayListSecureRandom() {
        int countNulls = 0;
        for (Integer i : arrayListSecureRandom) {
            if (i == null) {
                countNulls++;
            }
        }
        return countNulls;
    }
    @Benchmark
    public int countNullsArrayListSecureRandomYoda() {
        int countNulls = 0;
        for (Integer i : arrayListSecureRandom) {
            if (null == i) {
                countNulls++;
            }
        }
        return countNulls;
    }
    @Benchmark
    public int countNullsArrayList() {
        int countNulls = 0;
        for (Integer i : arrayListSecureRandom) {
            if (i == null) {
                countNulls++;
            }
        }
        return countNulls;
    }
    @Benchmark
    public int countNullsArrayListYoda() {
        int countNulls = 0;
        for (Integer i : arrayListSecureRandom) {
            if (null == i) {
                countNulls++;
            }
        }
        return countNulls;
    }

}