Java 平等比较——还有更明智的方法吗?
如何实现这种平等比较是一种明智的java方法Java 平等比较——还有更明智的方法吗?,java,comparison,Java,Comparison,如何实现这种平等比较是一种明智的java方法 boolean x = (a == b) || (a.equals(b)) 我想确保这两个对象的内容是相等的,但是null也可以,也就是说,两者可以为null,因此相等 更新:为了清楚起见,我必须多次实现这个比较,我不想每次都复制粘贴这些东西,特别是对于较长的对象名。有了“a”和“b”,它看起来小而简单,但会逐渐变大。。。我想知道我是否缺少了一些现有的Java特性。如果a为null,而b不是null,会发生什么?我想你真的想要: boolean x
boolean x = (a == b) || (a.equals(b))
我想确保这两个对象的内容是相等的,但是null也可以,也就是说,两者可以为null,因此相等
更新:为了清楚起见,我必须多次实现这个比较,我不想每次都复制粘贴这些东西,特别是对于较长的对象名。有了“a”和“b”,它看起来小而简单,但会逐渐变大。。。我想知道我是否缺少了一些现有的Java特性。如果a为null,而b不是null,会发生什么?我想你真的想要:
boolean x = (a == null && b == null) || (a != null && a.equals(b))
EDIT:您可以为类实现一个静态NullEquals方法,该方法接受该类的两个对象,并如上所述进行比较,以避免重写并使代码更清晰
public class MyClass {
public static boolean NullEquals( MyClass a, MyClass b )
{
return (a == null && b == null) || (a != null && a.equals(b));
}
}
if (MyClass.NullEquals(a,b))
{
...
}
典型的模式是:
if (a == b)
{
return true;
}
if (a == null || b == null)
{
return false;
}
// Now deal with a and b, knowing that they are non-identical, non-null references
是的,它是冗长的-但是如果你把它分成它自己的方法,你可以合理地控制它。你可能想更准确地看一下总是有用的东西。另一种方法
boolean x = null==a ? null==b : a.equals(b);
这不是一个直接的答案,但如果您有很多对象可以为空或不为空,这可能表明您的代码存在一些问题。请看,这是表示缺少对象的另一种方式无法添加注释, 将此视为对客户答案的评论 在Java中Null=Null是真还是假
更具体地说,应该处理什么是Null=Null,以及不同语言如何以及为什么处理这种情况?最常见的处理方法是:
a==null ? b==null : a.equals(b)
一个可能稍微高效但不太清晰的表达式是:
a==b || (a!=null && a.equals(b))
当然,您可以将其放入一个方法中:
public static boolean eq(Object a, Object b) {
return a==b || (a!=null && a.equals(b));
}
如果a为空,b为非空,请注意原始问题代码NPEs。出于性能原因,通常最好在执行任何其他逻辑之前检查标识,如问题中所述。然而,许多答案没有考虑到这一点 进行身份检查的最佳位置是在类上实现
equals
方法:
public boolean equals(Object obj) {
if(this == obj) return true;
...
}
如果已经/能够做到这一点,您可以轻松地进行比较:
a == null ? b == null : a.equals(b);
否则,您可能需要自己检查身份:
a == null ? b == null : (a == b || a.equals(b));
那么:
boolean x = equals( a, b );
public static boolean equals( Object a, Object b ) {
if ( a == null && a == b ) {
return true;
} else {
return a == b || a.equals( b );
}
}
让我想想
- 如果a为空,a为b,那么就可以了
- 如果a不为null,那么如果a==b(相同的ref),则通过短路返回true
- 若a不是b(b的2dns部分,或者b可能为null),则返回a(非null)。等于(b)任何b
是的 但是如果a为null而b不是,你也会得到一个null指针——我喜欢这样——适当地包装在一个方法中——除非我讨厌将常量与变量进行比较的方式,而不是相反的方式。这在Java中当然不是必需的,它在比较字符串引用和文本引用时非常有用,因为引用可能为null,即“text”.equals(str)。否则,这只是一种做作。它仍然与a或b是布尔型的,或者,从1.5开始,是布尔型的有关。我只对文字字符串执行此操作。+1。这就是我使用的习惯用法(除了
==null
,而不是null==
)。在像ApacheCommons这样肮脏的库中拖拽这样的琐事是不必要的,也不可取的。Java将两个null视为相等,因此通常相等检查器也应该这样做。