以此为例(摘自JavaReX检查器不工作):
1 2 3 4 5 6 7
| while(!checker) {
matcher = pattern.matcher(number);
if(matcher.find())
checker = true;
else
year++;
} |
如果使用.equals(false)来检查Boolean checker的值会有什么关系?
我知道这里也有类似的地方。但是,显然这个问题涉及的是原始的boolean,而不是对象包装器boolean;因此,.equals()不适用。
另外,是否应将boolean与boolean区别对待?
- 你为什么要用Boolean而不是Boolean来开始?
- 是的,我不知道这个用例。似乎是一个纯粹的学术问题。
- @乔斯基特·埃多克斯(Jonskeet EDOCX1)(2)。我想知道所有Boolean比较的更好实践
- 没有比Boolean更好的实践,因为比较对象包装器已经是一个糟糕的实践。哈哈。没有任何理由使用它,它只会打开你不需要的bug,如NullPointerExceptions。
试试这个:
1
| if (Boolean. TRUE. equals(yourValue )) { ... } |
作为额外的好处,这是空安全。
从您的评论来看,您似乎在寻找使用Boolean包装类的"最佳实践"。但实际上没有任何最佳实践,因为从这个类开始使用是一个坏主意。使用对象包装器的唯一原因是在必须使用的情况下(例如在使用泛型时,即在HashMap或类似文件中存储Boolean)。使用对象包装器没有好处,也没有很多缺点,最明显的是,它使您能够使用NullPointerException。
Does it matter if '!' is used instead of .equals() for Boolean?
这两种技术都容易受到NullPointerException的影响,因此在这方面并不重要。在第一种情况下,Boolean将被取消绑定到其各自的Boolean值中,并与正常值进行比较。在第二个场景中,您从Boolean类调用一个方法,如下所示:
1 2 3 4 5 6
| public boolean equals (Object obj ) {
if (obj instanceof Boolean) {
return value == ((Boolean)obj ). booleanValue();
}
return false;
} |
不管怎样,结果都是一样的。
Would it matter if .equals(false) was used to check for the value of the Boolean checker?
以上,没有。
Secondary question: Should Boolean be dealt differently than boolean?
如果您绝对必须使用Boolean类,在执行任何比较之前,一定要检查null类。例如。,
1 2 3 4 5 6
| Map <String, Boolean > map = new HashMap <String, Boolean >();
//...stuff to populate the Map
Boolean value = map. get("someKey");
if(value != null && value ) {
//do stuff
} |
这将工作,因为Java短路条件评估。也可以使用三元运算符。
1
| boolean easyToUseValue = value != null ? value : false; |
但说真的…只需使用基本类型,除非您被迫不使用。
- 谢谢您。关于你对Would it matter if .equals(false) was used to check for the value of the Boolean checker?的回答。Sunil和Migol都表示,.equals()阻碍了表现。然而,我发现郭先生的评论似乎与他们的观点相矛盾。谁是正确的?斯蒂夫说:"你看,埃多克斯1〔2〕"
- @两种方法都有不同的性能开销。第一种方法是将Boolean拆箱到Boolean上,第二种方法是将false装箱到Boolean上,然后用.equals()方法将其从Object抛回Boolean上。我的猜测是.equals()方法比较慢,但我必须做一个实际的基准测试。您可以自己执行每个操作数百万次,并测量所用的时间。
关于直接操作的执行和方法.equals()。.equals()方法的速度大约是==方法的4倍。
我做了以下测试。
执行==时:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class BooleanPerfCheck {
public static void main (String[] args ) {
long frameStart ;
long elapsedTime ;
boolean heyderr = false;
frameStart = System. currentTimeMillis();
for (int i = 0; i < 999999999; i ++) {
if (heyderr == false) {
}
}
elapsedTime = System. currentTimeMillis() - frameStart ;
System. out. println(elapsedTime );
}
} |
对于.equals()的性能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class BooleanPerfCheck {
public static void main (String[] args ) {
long frameStart ;
long elapsedTime ;
Boolean heyderr = false;
frameStart = System. currentTimeMillis();
for (int i = 0; i < 999999999; i ++) {
if (heyderr. equals(false)) {
}
}
elapsedTime = System. currentTimeMillis() - frameStart ;
System. out. println(elapsedTime );
}
} |
==系统总时间为1
.equals()的总系统时间与3 - 5不同。
因此,可以肯定的说,.equals()阻碍了性能,并且在大多数情况下,==更好地用于比较Boolean。
- 很好的回答。如果这两个值中有一个为空,==会有什么问题吗?
使用直接条件(如==,!=,!Condition)的性能比.Equals(Condition)稍有改善,因为在一种情况下,您从对象调用方法,而直接比较是直接执行的。
- "直接进行比较"是什么意思?我的解释是:不需要访问另一个类中的方法来执行比较,因此速度更快。
- 是的-基本上是因为您链接到超级类并从它调用一个方法。但根据比较的性质,您可能希望在"=="上使用.equals()。
- 好吧,我对你和米格尔说的话做了一些调查。我发现了这个。更具体地说,Steve Kuo表示equals will most likely be inlined by the JIT, so performance isn't an issue。他这是什么意思?
- 该死,错过了编辑的时间限制。关于我上面的评论,史蒂夫的评论似乎与你关于表现的声明不符。
只要checker不是null,您可以使用发布的!checker。这是可能的,因为Java 5,因为这个EDCOX1×3变量将被自动装箱到PREVIVITE EDOCX1×3的值。
作为对象?
等于
公共布尔等于(对象obj)
如果且仅当参数不为空并且是表示与此对象相同布尔值的布尔对象时返回true。
超越:类对象中的等于
参数:对象-要比较的对象。
返回:如果布尔对象表示相同的值,则为true;否则为false。
1 2 3 4
| boolean a = true;
boolean b = false;
System. out. println("a.equals(b):" + ((Object)a ). equals( ((Object)b ) )); |
输出:A.等于(B):假
.equals(false)将变慢,因为您在对象上调用一个虚拟方法,而不是使用更快的语法,而且大多数程序员都很意外,因为通常使用的代码标准并不认为您应该通过.equals(false)方法进行检查。
- 除了系统性能外,这两种方法有什么区别吗?
- @嗯,你也有编码约定——使用方法就是破坏它们。
- 是否有关于比较惯例的具体文件?我似乎无法在Oracle的Java约定中找到它们。
- @伊伦,这是众所周知的惯例,而且,在我10年的编程生涯中,我从未见过有人在代码中使用.equals(false)作为标准。阅读其他人的代码,看看Java文档中的例子——你找不到它。