Luk*_*Feo 3 java equality equals
这很简单,但我显然错过了一些非常大的东西.
Cat cat1 = new Cat("bob");
Cat cat2 = new Cat("bob");
System.out.println(cat1 == cat2);
//false since these references point to diferent objects
System.out.println(cat1.equals(cat2));
//returns false also??
Run Code Online (Sandbox Code Playgroud)
Cat 只是一个只有名字的简单类.
这里发生了什么,equals()工作怎么样?我的印象是它比较了对象的所有字段.似乎并非如此.
我需要为我的所有课程覆盖它吗?
是.
java.lang.Object提供equals()和的基本实现hashCode().特别是,他们不会反思实例的类型,这会(1)变得非常慢,(2)因为各种原因不希望在平等比较.
如果你想让equals()和hashCode()实际上用于比较值相等(而不是引用相等==),你需要在你自己的类型中实现它们.
请注意,仅仅实施它是不够的equals(); 虽然技术上会"有效",但它有可能导致各种怪异.简单的经验法则是:既不是,也不是两者,但绝不仅仅是一个.他们必须在同一领域工作; 如果equals()说两个实例相等,则调用hashCode()两者必须返回相同的值(也见hashCode()合同).
toString()使用代码覆盖以提供有问题的对象的有意义的描述通常也是一个好主意.虽然不是严格需要的,但您只需要在调试器中对此进行一次实现以实现该值.(感谢@JonTaylor提到这个非常有用的相关小贴士.)
并且它调用它的.NET GetHashCode(),而Java仅用hashCode()作函数名称...