繁体   English   中英

关于在实现等于对象以比较Java中的对象时使用此方法

[英]regarding using this in implementing equals for comparing objects in 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;
}

}

实现Java类的equals方法是一个经常讨论的话题。 通常,您需要确保在以下情况下该方法返回true

  • 您与this进行比较的对象是关于指针的相同对象(对象==此)或
  • 您与this进行比较的对象关于您的域是相同的

所以,关于你的问题,你问前者的情况下,其中的Java刚刚检查,如果object通过, this是指向内存中(也许这个链接可以帮助你在同一地址http://www.javaworld.com/article/2072762 /java-app-dev/object-equality.html )。

简短说明:实现equals方法时,通常遵循以下模式:

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

     if (object == this) return true; 
  2. 您要确保没有任何null实例(为避免进一步的NullPointerException ,如果它为null则它永远不能相等,即,

     else if (object == null) return false; 
  3. 您检查对象在域中是否相等,是否相等(例如,如果id相等,则可以假定dao相等); 在进行特定于域的验证之前,通常请务必确保您拥有正确实例的对象,即

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

    要么

     else if (this.getClass().isInstance(obj.getClass()) { ... } 
  4. 在其他所有情况下,您都想返回false,即

     else return false; 

注意:在实现equals方法时,通常使用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;
    }
}

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

对于像int,char'=='这样的原始数据类型,它比较值,对于对象,它比较那里的引用。 一些文献说,'=='的工作确实很奇怪,因为比较引用并不是很重要。

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

您也可以检查这个问题: Java中“ this”的含义是什么?

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

obj == obj1

上面提到的代码实际上是根据创建两个对象的内存位置地址检查是否相等,因此,上面的代码行检查我们尝试检查相等性的两个对象是否具有相同的引用。 如果两者都具有相同的引用,则我们无需再做任何杂技检查相等性。 像这样

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

car.equals(car1);

您可以清楚地看到car和car1具有相同的引用方式,它们都是具有相同存储地址的相同对象。 因此不必通过检查属性来检查相等性,它只是避免执行额外的代码。

this是指在其下执行equals函数的类的对象。 如果obj是为了进行比较,以平等,需要其他物体objthis指的是相同的实例,然后他们是真的吧?

例如

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

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

TL; DR-检查这种情况有助于优化,因为这避免了检查两个对象是否相等所需的额外工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM