【发布时间】:2014-01-13 16:57:49
【问题描述】:
我正在尝试使用复制构造函数来克隆车辆对象。为了演示,我重写了一个名为 Vehicle 的类的toString() 方法。但克隆必须是唯一且完全独立的。
如果我创建了数千个 Vehicle 对象的克隆,是否可以保证在使用 equals() 方法相互检查时它们都是唯一的?我的印象是,当我使用equals() 方法进行比较时,可以保证创建的每个对象始终具有一个新的唯一哈希码,该哈希码永远不会相等。
已编辑: 我的问题真的是,使用默认的 equals() 方法来比较我的 100000 个克隆是否会确保每个克隆实际上都是唯一的,而 equals() 将始终返回 false ???
public class App {
public List<Vehicle> buildCar(String type, int hp)
{
List<Vehicle> vs = new ArrayList<Vehicle>();
Vehicle vObject = new Vehicle();
vObject.setHorsePower(hp);
vObject.setType(type);
Vehicle newV = new Vehicle(vObject);
vs.add(newV);
vs.add(vObject);
return vs;
}
public static void main(String args[]){
App ap = new App();
List<Vehicle> vehicles = new ArrayList<Vehicle>();
vehicles.addAll(ap.buildCar("car",100));
Vehicle v1 = vehicles.get(0);
Vehicle v2 = vehicles.get(1);
System.out.println(v1.equals(v2)); // prints false.
//System.out.println(v2.hashCode());
}
}
【问题讨论】:
-
哈希码并不意味着唯一,只有
As much as is reasonably practical。 -
那么 equals() 方法是否默认使用 hashcode 来检查相等性?如何使用 equals() 等方法确保克隆在我的 java 代码检查中是单独的?
-
阅读每个方法的javadoc。您的
equals()(Indicates whether some other object is "equal to" this one.) 不应在内部使用hashcode()(Returns a hash code value for the object.)。 -
是的,但是看看文档对 equals() 方法的说法:
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.基本上我的问题是这样的:在使用它进行比较时,我可以依赖默认的 equals() 方法是正确的吗100000 个相互克隆? -
不,你不能依赖默认的 equals。阅读完整的 javadoc 条目。默认的
equals只检查与==的引用相等性。