我想知道这两个代码之间的性能是否存在差异。
String sample="hello";
if(sample!=null)
{
if(!sample.equals(""))
{
// some code in here
}
}
或
String sample="hello";
if(sample!=null && !sample.equals(""))
{
// some code in here
}
据我所知,在第一个代码中,如果sample不为null,那么只有它会进入块。第二段代码也是如此。 我想知道的是性能或更好的编码标准有何不同?为什么?
答案 0 :(得分:14)
如果您要询问性能,则应始终衡量。但不,不应该有所不同。此外,如果 是你唯一的性能问题代码,那么我会认真地羡慕你。
至于编码标准。较少的嵌套几乎总是更好阅读和遵循。这意味着将两者放在一个if
中,特别是因为它们是相关的是可取的。模式
if (check_foo_for_null && compare_foo)
非常常见,因此比其他嵌套if
更不令人惊讶。
编辑:备份:
我有两个小方法:
static boolean x(String a) {
if (a != null && a.equals("Foo"))
return true;
else return false;
}
static boolean y(String a) {
if (a != null) {
if (a.equals("Foo")) {
return true;
} else return false;
} else return false;
}
产生以下代码:
static boolean x(java.lang.String);
Code:
0: aload_0
1: ifnull 15
4: aload_0
5: ldc #16 // String Foo
7: invokevirtual #21 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
10: ifeq 15
13: iconst_1
14: ireturn
15: iconst_0
16: ireturn
static boolean y(java.lang.String);
Code:
0: aload_0
1: ifnull 17
4: aload_0
5: ldc #16 // String Foo
7: invokevirtual #21 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
10: ifeq 15
13: iconst_1
14: ireturn
15: iconst_0
16: ireturn
17: iconst_0
18: ireturn
除了一个无关的else
跳转目标,代码是相同的。如果你甚至没有else
:
static boolean z(String a) {
if (a != null) {
if (a.equals("Foo"))
return true;
return false;
}
然后结果真的一样:
static boolean z(java.lang.String);
Code:
0: aload_0
1: ifnull 15
4: aload_0
5: ldc #16 // String Foo
7: invokevirtual #21 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
10: ifeq 15
13: iconst_1
14: ireturn
15: iconst_0
16: ireturn
答案 1 :(得分:9)
正如其他人所说,表现不应有任何差别。 小提示 - 等于几乎总是调用 instanceof ,它返回 false 为null。 所以写道:
if( !"".equals(foo)) {...}
进行相同的检查并且是空的。
答案 2 :(得分:2)
Bothe在性能方面没有区别。因为在第一种情况下它会检查一个条件,如果失败则它不会进入内部。在第二种情况下,JVM检查第一个条件,如果返回false,则JVM永远不会进行第二次检查。作为逻辑&&如果first false ,则运算符将始终 false 。
在编码标准方面,我会选择第二个选项,因为它的编码行数较少。
答案 3 :(得分:1)
由于bytcode
在编译时执行优化,因此生成的if(sample!=null && !sample.equals(""))
很可能会优化为java
。
如果您在谈论您编写的实际代码,最好只有一个if
。由于两个if
的结构对于编译器来说更复杂(没有优化)。虽然我没有经验数据来支持这一点。