有一个 Java bean Car 可能包含两个值:型号和价格。
现在假设我以这种方式覆盖 equals() 和 hashcode() 仅检查模型:
public boolean equals(Object o) {
return this.model.equals(o.model);
}
public int hashCode() {
return model.hashCode();
}
这允许我以这种方式检查数组列表是否已经包含相同型号的 Car 项目(并且与价格无关):
List<Car> car = new ArrayList<Car>();
car.add(new Car("carA",100f));
car.add(new Car("carB",101f));
car.add(new Car("carC",110f));
System.out.println(a.contains(new Car("carB",111f)));
它返回 TRUE。没关系,因为汽车已经存在!
但是现在我决定 ArrayList 不好,因为我想维护有序的项目,所以我用 TreeSet 替换它是这样的:
Set<Car> car = new TreeSet<Car>(new Comparator<Car>() {
@Override
public int compare(Car car1, Car car2) {
int compPrice = - Float.compare(car1.getPrice(), car2.getPrice());
if (compPrice > 0 || compPrice < 0)
return compPrice;
else
return car1.getModel().compareTo(car2.getModel());
}});
car.add(new Car("carA",100f));
car.add(new Car("carB",101f));
car.add(new Car("carC",110f));
System.out.println(a.contains(new Car("carB",111f)));
但是现在有一个问题,它返回 FALSE ......为什么?
似乎当我使用 arrayList 调用 contains() 时,调用了方法 equals()。但是,当我使用带有比较器的 TreeSet 调用 contains() 时,似乎使用了比较器。
为什么会这样?