Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 平等比较——还有更明智的方法吗?_Java_Comparison - Fatal编程技术网

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

如何实现这种平等比较是一种明智的java方法

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视为相等,因此通常相等检查器也应该这样做。