比较两个对象,其中任何一个都可以为null

我在我的一个类中有一个函数,它将自己与同一个类的另一个实例进行比较 – 并找出哪些变量不同。 这是为了最大限度地减少主数据库的网络负载(仅上传需要上传的数据,而不是上传整个对象)。

为此,我一直在尝试使用object.equals()函数来比较这两个对象。

我很快发现object.equals()不处理null s,在阅读完这个问题之后 ,我理解为什么。

所以我破坏的代码示例如下:

 public class MyObject { String myString; String myString2; public String getChangedVars(MyObject comparisonObj) { ArrayList changedVars = new ArrayList(); if (!this.myString.equals(comparisonObj.myString)) changedVars.add("myString"); if (!this.myString2.equals(comparisonObj.myString2)) changedVars.add("myString2"); return changedVars.toString(); } } 

我的问题是 – 基于被比较的任何一个变量可能为null,比较两个变量同时避免NullPointerException的简单方法是什么?

编辑:简单地检查两个对象上的null首先不能正常工作,因为我仍然想比较对象是否有引用。 例如,如果一个项为null而另一个项不为,则我希望将其解析为true ,因为变量已更改

自1.7以来,jdk中有一个新的实用程序类,即Objects

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

您可以使用Objects.equals ,它处理null。

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

 if(Objects.equals(myString,myString2)){...} 
  if (this.myString != null && this.myString.equals(comparisonObj.myString)) { changedVars.add("myString"); } 

使用apache提供的StringUtils

 StringUtils.equals(myString,comparisonObj.myString); 

您可以使用Apache对象utils

ObjectUtils.equals(Object object1, Object object2) – 返回布尔值

此方法已被Java 7中的java.util.Objects.equals(Object,Object)取代