版权声明:欢迎转载 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不等价于==
本文仅从学术角度探讨二者的异同之处,工程中的具体实现应另当别论。