Java null.equals(对象o)

Sar*_*lor 22 java null object

我知道不可能像这样在null对象上调用equals方法:

//NOT WORKING
            String s1 = null;
            String s2 = null;
            if(s1.equals(s2))
            {
                System.out.println("NOT WORKING :'(");
            }
Run Code Online (Sandbox Code Playgroud)

但在我的情况下,我想比较两个数据库中的两个对象,这两个对象可以有属性null ...

那么比较两个属性的方法是什么,知道我们不确定该值是null还是已填充.

这个方法好还是不好?

//WORKING
            String s1 = "test";
            String s2 = "test";
            if(s1 == s2 || s1.equals(s2))
            {
                System.out.println("WORKING :)");
            }

            //WORKING
            String s1 = null;
            String s2 = null;
            if(s1 == s2 || s1.equals(s2))
            {
                System.out.println("WORKING :)");
            }
Run Code Online (Sandbox Code Playgroud)

我不确定,因为在这种情况下,它不起作用......:

//NOT WORKING
            String s1 = null;
            String s2 = null;
            if(s1.equals(s2)|| s1 == s2  )
            {
                System.out.println("NOT WORKING :'''(");
            }
Run Code Online (Sandbox Code Playgroud)

mik*_*era 31

我通常使用我编写的静态实用函数equalsWithNulls来解决此问题:

class MyUtils {
  public static final boolean equalsWithNulls(Object a, Object b) {
    if (a==b) return true;
    if ((a==null)||(b==null)) return false;
    return a.equals(b);
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

if (MyUtils.equalsWithNulls(s1,s2)) {
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这种方法的优点:

  • 在单个函数调用中完成完全相等性测试的复杂性.我认为这比在每次执行此操作时在代码中嵌入一堆复杂的布尔测试要好得多.因此导致错误的可能性要小得多.
  • 使您的代码更具描述性,从而更易于阅读.
  • 通过明确提及方法名称中的空值,您向读者传达他们应该记住一个或两个参数可能为null.
  • 首先是(a == b)测试(一种优化,它避免了在a和b非空但是指向完全相同的对象的相当常见的情况下调用a.equals(b)的需要)

  • 注意,由于Java 7这个方法是内置的:`Objects.equals(obj1,obj2)` (4认同)

Ksh*_*tij 24

在执行equals方法之前,您需要检查至少一个不为null -

if(s1 == s2 || (s1!=null && s1.equals(s2)))  {
   System.out.println("WORKING :)");
} 
Run Code Online (Sandbox Code Playgroud)

s1==s2将是有效的null==null.但即使一个不是null,那么你需要在做等于之前检查至少s1.

更新:由@'bernard paulus'编辑,如果您使用的是Java 7,则可以使用java.util.Objects.equals(Object,Object)


Jus*_*tas 15

使用的另一种选择:

Objects.equals(identification, criteria.getIdentification())
Run Code Online (Sandbox Code Playgroud)

java.util.Objects

此类包含用于对对象进行操作的静态实用程序方法.这些实用程序包括null-safe或null-tolerant方法,用于计算对象的哈希代码,返回对象的字符串以及比较两个对象.

自:1.7

public static boolean equals(Object a,Object b)

如果参数彼此相等则返回true,否则返回false.因此,如果两个参数都为null,则返回true,如果只有一个参数为null,则返回false.否则,通过使用第一个参数的equals方法确定相等性.


小智 5

尝试使用org.apache.commons.lang中的ObjectUtils类

public static boolean equals(java.lang.Object object1,
                         java.lang.Object object2)
Run Code Online (Sandbox Code Playgroud)

从api文档...

比较两个对象是否相等,其中一个或两个对象都可以为null。

ObjectUtils.equals(null,null)= true

ObjectUtils.equals(null,“”)= false

ObjectUtils.equals(“”,null)=否

ObjectUtils.equals(“”,“”)= true

ObjectUtils.equals(Boolean.TRUE,null)=否

ObjectUtils.equals(Boolean.TRUE,“ true”)=否

ObjectUtils.equals(Boolean.TRUE,Boolean.TRUE)= true

ObjectUtils.equals(Boolean.TRUE,Boolean.FALSE)=否