因为很难(不可能?)做到正确,尤其是 对称
属性。
说你有一
Vehicle堂课
Car extendsVehicle。
Vehicle.equals()产生
true如果参数也是
Vehicle并且具有相同的重量。如果要实现,
Car.equals()则
true仅当参数也是汽车(重量除外)时,它才应屈服,并且还应比较制造商,发动机等。
现在想象下面的代码:
Vehicle tank = new Vehicle();Vehicle bus = new Car();tank.equals(bus); //can be truebus.equals(tank); //false
true如果巧合的是,油箱和客车的重量相同,则第一个比较可能会得出结果。但是由于坦克不是汽车,因此将其与汽车相比较总是可以得到收益的
false。
您有几种解决方法:
严格:两个对象 只有且 具有完全相同的类型(并且所有属性都相同) 时才 相等。这很不好,例如,当您几乎没有子类化以添加某些行为或装饰原始类时。一些框架也在不引起您注意的情况下对您的类进行子类化(Hibernate,带有CGLIB代理的Spring AOP …)
松散的:如果两个对象的类型“兼容”并且它们的内容(语义上)相同,则它们是相等的。例如,如果两个集合包含相同的元素,则它们是相等的,一个
HashSet
与另一个 无关紧要TreeSet
(感谢 @veer 指出这一点)。
这可能会产生误导。取2
linkedHashSets(其中插入顺序作为合同的一部分很重要)。但是,由于
equals()仅考虑原始
Set合同,因此
true即使对于明显不同的对象,该比较也会产生收益:
Set<Integer> s1 = new linkedHashSet<Integer>(Arrays.asList(1, 2, 3));Set<Integer> s2 = new linkedHashSet<Integer>(Arrays.asList(3, 2, 1));System.out.println(s1.equals(s2));



