java null检查语法差异

时间:2013-06-17 08:43:26

标签: java performance optimization syntax null

迄今为止在

之间发布的任何Java版本中是否存在性能差异

foo != null

null != foo

我个人认为对象的上述两种形式的空检查的行为没有任何变化,但不确定哪一种表现更好。我知道差异会很小,如果有的话,但是想知道为什么有人以这种方式编写了所有代码。

6 个答案:

答案 0 :(得分:6)

应该没有性能差异,但形式可读性透视foo!= null更好。因为通常在左侧我们将想要比较的内容与右侧的值进行比较。通常我们会将我们的对象比如foo与null进行比较。

答案 1 :(得分:5)

这来自旧C时代。它以foo == null(null == foo)开始。

在c语法中有效(编译器没有抱怨):

if (foo = null) {
}

为了防止这种微妙的错误语法开始使用:

if (null == foo) {
}

因为null是常量     if(null = foo){     }

变成语法错误。

在java中,只有一个案例重要:

boolean someBoolean;
if (someBoolean = true) {
}

是运行时错误,但编译

这个

boolean someBoolean;
if (true = someBoolean) {
}

是编译错误。

没有性能问题,在某些情况下只有错误预防。

答案 2 :(得分:4)

Equality is symmetric。所以顺序在语义上无关紧要。

传统风格说你先把你要检查的东西放在最后。这遵循(至少许多欧洲语言)语言形式,例如“是x null吗?”不是“是空x?”。

在历史的某个时刻,人们习惯在C中写if (NULL == x)。这样编译器会通过说“你不能分配给常量”来捕获意外的语法错误if (NULL = x)。 。标准代码质量工具现在可以获取这些类型的错误,因此这种做法现在已经过时了。

答案 3 :(得分:3)

时尚是关于yoda风格。这只是个人喜好的问题。

  

“Yoda Conditions” - 使用if(constant == variable)而不是if   (变量==常量),如if(4 == foo)。因为它就像说   “如果蓝色是天空”或“如果高大就是男人”。

More on SO

答案 4 :(得分:2)

这两种形式没有区别。

无论如何,都有以下指令 - 加载foo的值,与0(null)比较并读取比较结果。

现在,如果是equals()方法,则会有所不同:)

答案 5 :(得分:2)

public class Stack
{
    public static void main(String[] args)
    {
        Object obj0 = null;
        Object obj1 = new Object();
        long start;
        long end;
        double difference;  
        double differenceAvg = 0;

        for (int j = 0; j < 100; j++)
        {
            start = System.nanoTime();

            for (int i = 0; i < 1000000000; i++)
                if (obj0 == null);

            end = System.nanoTime();
            difference = end - start;
            differenceAvg +=difference;
        }

        System.out.println(differenceAvg/100);
        differenceAvg = 0;

        for (int j = 0; j < 100; j++)
        {
            start = System.nanoTime();

            for (int i = 0; i < 1000000000; i++)
                if (null == obj0);

            end = System.nanoTime();
            difference = end - start;
            differenceAvg +=difference;
        }

        System.out.println(differenceAvg/100);
        differenceAvg = 0;

        for (int j = 0; j < 100; j++)
        {
            start = System.nanoTime();

            for (int i = 0; i < 1000000000; i++)
                if (obj1 == null);

            end = System.nanoTime();
            difference = end - start;
            differenceAvg +=difference;
        }

        System.out.println(differenceAvg/100);
        differenceAvg = 0;

        for (int j = 0; j < 100; j++)
        {
            start = System.nanoTime();

            for (int i = 0; i < 1000000000; i++)
                if (null == obj1);

            end = System.nanoTime();
            difference = end - start;
            differenceAvg +=difference;
        }

        System.out.println(differenceAvg/100);      
    }
}

enter image description here

Object被初始化的情况下,没有收集任何内容;但是,当Objectnull时,几乎在每个平均案例中,obj0 == null都比null == obj0快。我又跑了21次,其中20次就是这样。