关于在实现equals用于比较Java中的对象时使用它

时间:2016-03-21 04:26:39

标签: java

我在本论坛的另一个问题主题中看到了一个关于定义equals的代码段。但我的问题是以下代码是做什么的,以及为什么需要它?感谢。

   if (obj == this)
   {
       return true;
   }

原始代码如下所示。http://stackoverflow.com/questions/8338326/what-does-equalsobject-obj-do#

public boolean equals(Object obj)
{
if (obj == this)
{
    return true;
}
if (obj == null)
{
    return false;
}
if (obj instanceof Contact)
{
    Contact other = (Contact)obj;
    return other.getFirstName().equals(getFirstName()) &&
            other.getLastName().equals(getLastName()) &&
            other.getHomePhone().equals(getHomePhone()) &&
            other.getCellPhone().equals(getCellPhone());

}
else
{
    return false;
}

}

5 个答案:

答案 0 :(得分:1)

实现Java类的equals方法是一个经常讨论的主题。通常,您希望确保该方法返回true,如果:

  • 您比较this的对象与指针(object == this)或
  • 的对象相同
  • 您比较this的对象与您的域名相同

关于你的问题,你要问的是前一种情况,其中Java只是检查object是否通过,this是否指向内存中的同一地址(也许这个链接可以帮助你{{ 3}})。

简短说明:当您实施equals方法时,通常会遵循以下模式:

  1. 检查你是否有相同的对象(关于指针),即

    if (object == this) return true;
    
  2. 您确保自己没有null个实例(以避免进一步NullPointerException,如果它null else if (object == null) return false; 它永远不会相等,即

    id
  3. 你检查对象在你的域中是否有相同的平均值(例如,如果else if (this.getClass().equals(obj.getClass()) { ... } 相等则可以认为dao相等);在进行域特定验证之前,通常总是确保你有一个正确实例的对象,即

    else if (this.getClass().isInstance(obj.getClass()) { ... }
    

    else return false;
    
  4. 在所有其他情况下,您想要返回false,即

    equals
  5. 注意: 在实现Objects.equals(...)方法时,使用@Override public boolean equals(final Object obj) { if (obj == this) { // we have the same object regarding the pointers (e.g., this.equals(this)), or have a look at 'Manjunath M' post for a different example return true; } else if (obj == null) { // we compare with null (e.g., this.equals(null)) return false; } else if (Contact.class.isInstance(obj.getClass())) { /* * If you want to be more strict you could also use: * getClass().equals(obj.getClass()) */ Contact other = Contact.class.cast(obj); return Objects.equals(other.getFirstName(), getFirstName()) && Objects.equals(other.getLastName(), getLastName()) && Objects.equals(other.getHomePhone(), getHomePhone()) && Objects.equals(other.getCellPhone(), getCellPhone()); } else { return false; } } 方法比较实例的不同属性通常很有用。

    示例:

    'ui.bootstrap.demo'

答案 1 :(得分:1)

Java中的

'=='用于比较对象的引用。如果将对象与自己的self进行比较,那么equals函数必须返回true。这就是为什么在equals方法中添加这个条件的原因。

对于像int这样的原始数据类型,char'=='这会比较值以及它与引用进行比较的对象。一些文献说'=='的工作真的很有用,因为比较参考并不是很重要。

答案 2 :(得分:0)

这个引用if语句所在的同一个对象。通过比较obj == this,它检查传递的对象是否是调用equals函数的对象本身。

你也可以查看这个问题: What is the meaning of "this" in Java?

答案 3 :(得分:0)

如果你没有覆盖你们各自类中的equals方法,那么它执行已经在Object类中的equals方法中编写的实现(所有类的最大类),他们正在检查这样的相等性

obj == obj1

上面提到的代码实际上是根据创建它们的那两个对象的内存位置地址来检查相等性,因此上面的行检查我们试图检查相等性的两个对象是否具有相同的引用。如果两者都有相同的参考,我们不必再做马戏来检查相等性。像这样

Car car = new Car();
Car car1 = car;

car.equals(car1);

您可以清楚地看到汽车和汽车1具有相同的参考意味着两者都是具有相同内存地址的相同对象。因此,不必通过检查attributes来检查相等性。这只是避免执行额外的代码。

答案 4 :(得分:0)

this指的是正在执行equals函数的类对象。如果obj是需要进行相等性比较的另一个对象,objthis引用相同的实例则它们是真的,对吗?

例如

MyClass myObject = new MyClass();
myObject.equals(obj);

在这种情况下,equals方法中的thisobj都会引用相同的实例myObject。在这种情况下,我们不需要检查这些对象的其他属性是否相等。

TL; DR - 检查此类案例有助于优化,因为这样可以避免检查两个对象是否相等所需的额外工作。