Java (a!=null)或(null!=a)
将变量与Java (a!=null)或(null!=a),java,variables,null,Java,Variables,Null,将变量与null进行比较或将null与变量进行比较有什么区别吗 例如,哪个比较更好(a!=null)还是(null!=a)? 我在某个地方读到第二个更快,但没有找到原因。不,没有什么区别。不,没有一个更快。那是个彻头彻尾的谎言。使用第二个版本没有任何好处。只会让可读性更差 这一切都来自C语言,在C语言中,您可能会错误地编写 if(x = 3) 而不是 if( x == 3) 有些人认为最好先写常量,在这种情况下,如果你写的是=而不是=,你会得到一个编译器错误。因此,一些消息来源建议写作 i
null
进行比较或将null
与变量进行比较有什么区别吗
例如,哪个比较更好(a!=null)
还是(null!=a)
?
我在某个地方读到第二个更快,但没有找到原因。不,没有什么区别。不,没有一个更快。那是个彻头彻尾的谎言。使用第二个版本没有任何好处。只会让可读性更差 这一切都来自C语言,在C语言中,您可能会错误地编写
if(x = 3)
而不是
if( x == 3)
有些人认为最好先写常量,在这种情况下,如果你写的是=
而不是=
,你会得到一个编译器错误。因此,一些消息来源建议写作
if(3 == x)
有些人不知道为什么这是必要的,他们继续并将这一想法推广到结构和语言中,而这是毫无意义的。在我看来,它在最初的C环境中也没有多大意义,但这是个人品味的问题。即使速度有差异,我也认为它在99.99%的应用程序中完全无关紧要。事实上,我不希望有任何速度差。我个人认为
如果(a!=null)
更具可读性——在大多数情况下,可读性比性能更重要。这样做通常是为了防止意外赋值而不是比较:
( a = null ) //will not give error
( null = a ) //will give error
我相当肯定效率不是一个原因,如果是的话,优化器将以二进制形式呈现相同的代码。不太可能,至少现在不是java。在以前,可能是C,您可能会意外地忘记感叹号,代码会编译得很好。基本上,
a=null
将被视为将null赋值给a
并始终计算为true的表达式(因为赋值成功)
今天的编译器要健壮得多。虽然,旧习惯很难改掉,我仍然写
null!=a
:-)在对字符串进行操作时,您可能只希望在变量前面使用一个文本
if(“abcd.equals(name))
不会抛出一个NPE
,其中asif(name.equals(“abcd”)
会抛出一个name
如果将null
我们不能在Java中犯这个错误,但是C/C++啊!我的意思是,由于java编译器的原因,您的两条语句都会出错if(a=null)
在某些C/C++编译器中很好。@H3S:如果我们足够努力,在Java中也会犯这个错误:Boolean a=true;如果(a=null){}
。没有编译错误,但在运行时会出现NPE。@Thilo:噢,对不起!我忘记了布尔值type@H3S你说得对-不包括Thilo的例子,这是一个很好的例子-我没有想到。Yoda条件FTW:)(链接仅可供10k用户访问)我发现null!=A/COD>更可读,习惯的问题:——AsiWaYa:从C或C++发展的习惯?用这种方式进行比较可能是有道理的(尽管现代编译器会选择意外赋值,IIRC),但我相信大多数没有明确好处背景的开发人员都会发现“变量优先”形式更具可读性。很抱歉,谈话这么晚了,但是您对“将null赋值给a
并始终求值为true(因为赋值成功)”的表达式不正确。它求值为null的值(因此如果null为false,则可能为false)。实际上,存在速度差异。测试null==var
要慢一条指令,因为null必须被推到堆栈上。不多,但也不完全相同。@Bohemian:这是优化器处理此类微优化的工作