1

迄今为止发布的任何 Java 版本之间是否存在性能差异?

foo != null

null != foo?

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

4

6 回答 6

6

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

于 2013-06-17T08:50:35.420 回答
5

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

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

if (foo = null) {
}

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

if (null == foo) {
}

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

变成语法错误。

在java中,只有一种情况很重要:

boolean someBoolean;
if (someBoolean = true) {
}

是运行时错误,但可以编译

这个

boolean someBoolean;
if (true = someBoolean) {
}

是编译错误。

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

于 2013-06-17T08:52:56.167 回答
4

平等是对称的。所以顺序在语义上并不重要。

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

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

于 2013-06-17T08:47:59.713 回答
3

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

“尤达条件”——使用 if (constant == variable) 而不是 if (variable == constant),例如 if (4 == foo)。因为这就像说“如果天空是蓝色的”或“如果男人是高的”。

更多关于 SO

于 2013-06-17T08:46:50.800 回答
2

不,这两种形式没有区别。

不管怎样,都有以下指令——加载foo的值,与0(null)比较,读取比较结果。

现在,如果它是 equals() 方法,那将是不同的:)

于 2013-06-17T08:48:14.000 回答
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);      
    }
}

在此处输入图像描述

Object初始化的情况下,什么都没有收集到;但是,当Object是时null,几乎在每个平均情况下,obj0 == null都比 快null == obj0。我进行了 21 次额外的处决,其中 20 次是这种情况。

于 2013-06-17T09:14:07.637 回答