Java中的hashCode()与equals()的比较

版权声明:欢迎转载 https://blog.csdn.net/suntengnb/article/details/83743620

测试代码:

public class Obj
{
    private String name;
    private String shape;
    public Obj(String n,String s)
    {
        name = n;
        shape = s;
    }
    public static void main(String[] Args)
    {
        Obj a = new Obj("money","round");
        Obj b = a;
        System.out.println("a和b指向的是同一个对象,内存位置相同,自然地,对象内容也相同");
        System.out.println(a.hashCode() == b.hashCode());
        System.out.println(a.equals(b));// 等价于 ==

        System.out.println("c和d指向的对象,对象内容相同,但内存位置不同");
        Obj c = new Obj("money","round");
        Obj d = new Obj("money","round");
        System.out.println(c.hashCode() == d.hashCode());
        System.out.println(c.equals(d));// 等价于 ==
        // 结论:Java默认采用的是引用相等性
        // hashCode返回的是每个对象特有的序号
        // equals(==)比较的是字节组合,如果引用到相同的对象,字节组合也会一样,反之则不一样。
        // 实现引用相等性:原始的hashCode、原始的equals,二者皆可
        // 实现对象相等性:重载hashCode,使得其返回只与对象的内容有关的哈希码 或者 重载equals
    }
//    重载实例如下
//    public int hashCode()
//    {
//        return name.hashCode() + shape.hashCode();
//    }
//    public boolean equals(Obj o)
//    {
//        return name == o.name && shape == o.shape;
//    }
}

声明:
需要注意的是,在String等库中,equals被重载,此时equals不等价于==
本文仅从学术角度探讨二者的异同之处,工程中的具体实现应另当别论。

猜你喜欢

转载自blog.csdn.net/suntengnb/article/details/83743620