==
操作符检查 ”参数是否为这个对象的引用“。如果是,则返回 true。这只是一种性能优化。引用相同,则必定相等,无需进行后续对值的比较。instanceof
操作检查 ”参数是否为正确的类型“。如果不是,则返回 false。一般来说,所谓 ”正确的类型“ 是指 equals
方法所在的那个类。某些情况下,是指该类所实现的某个接口。如果类实现的接口改进了 equals
约定,允许在实现了该接口的类之间进行比较,那么就使用接口。接口集合如 Set、List、Map 和 Map.Entry 具有这样的特性instanceof
测试,所以能确保成功。Float.compare(float a, float b)
和 Double.compare(double a, double b)
。Arrays.equals
进行比较equals
时总是要覆盖 hashCode
equals
方法过于只能equals
声明中的 Object 对象替换为其他的类型。编写和测试 equals 和 hashCode 方法都是十分繁琐的,得到的代码也很琐碎。代替这些手工编写和测试这些方法的最佳途径,就是使用一些自动生成代码的框架。如 Google 开源的 AutoValue 框架、Project Lombok、Immutables等,他会自动替换生成这些方法,通过类中的单个注解就能触发。在大多数情况下,它们生成的 equals 和 hashCode 方法与我们手工编写的方法基本一致。
此外,还可以使用 IDE 自动生成的 equals 和 hashCode 方法,但得到的源代码更加冗长。