Object类的equals方法

2017-10-18  本文已影响0人  鉴闻俗说

1、Object类中默认的实现方式是:return this == obj。也就是说,只有this和obj引用同一个对象的时候,才会返回true

2、equals方法需要满足以下规则:
(1)、自反性:x.equals(x)应该返回true;
(2)、对称性: x.equals(y)为true,那么y.equals(x)也为true;
(3)、传递性:x.equals(y)为true,并且y.equals(z)为true,那么x.equals(z)也应该为true;
(4)、 一致性: x.equals(y)的第一次调用为true,那么第二次、第三次、第n次调用也应该为true,前提条件是在比较之前没有修改x也没有修改y;
(5)、对非空引用x, x.equals(null)返回false。

3、用一个demo简单介绍一下equals方法的编写

public class EqualsDemo
{
    private String name;
    private int age;

    public EqualsDemo()
    {
    }

    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if ((obj == null) || (obj.getClass() != this.getClass()))
            return false;

        // 能执行到这里,说明obj和this同类且非null。
        EqualsDemo p = (EqualsDemo) obj;
        return age == p.age && (name == p.name || (name != null && name.equals(p.name)));

    }
    
    @Override
    public int hashCode()
    {
        // 重写equals,也必须重写hashCode。具体后面介绍。
    }

}
if(!(obj instanceof EqualsDemo))
     return false; // avoid 避免!

因为它违反了规则中的对称性,例如;假设Dog类扩展了Animal类。这就会导致

animal.equls(dog) 返回true
dog.equals(animal) 返回false

仅当EqualsDemo类没有子类的时候,这样做才能保证是正确的。

if ( Double.doubleToLongBits(d1) == Double.doubleToLongBits(d2) ) //d1 和 d2 是double类型

if(  Float.floatToIntBits(f1) == Float.floatToIntBits(f2)  )      //f1 和 f2 是d2是float类型

注释以上部分内容来自:
lulipro

上一篇:ArrayList与LinkedList比较
下一篇:关于Object类的hashcode()方法的特点

上一篇 下一篇

猜你喜欢

热点阅读