Java 如何确保hashcode不会偶然地等于同一类型的另一个对象
我正在试验复制构造函数来克隆车辆对象。我正在重写名为Vehicle的类的Java 如何确保hashcode不会偶然地等于同一类型的另一个对象,java,hashcode,Java,Hashcode,我正在试验复制构造函数来克隆车辆对象。我正在重写名为Vehicle的类的toString()方法,只是为了表示。但克隆必须是独一无二的,完全独立的 如果我创建了数千个车辆对象克隆,使用equals()方法相互检查时,是否可以保证所有克隆都是唯一的?我的印象是,当我使用equals()方法进行比较时,创建的每个对象都保证始终有一个新的、唯一的hashcode,它永远不会与另一个hashcode相等 编辑: 我的问题是,使用默认的equals()方法来比较我的100000个克隆是否可以确保每个克隆实
toString()
方法,只是为了表示。但克隆必须是独一无二的,完全独立的
如果我创建了数千个车辆对象克隆,使用equals()
方法相互检查时,是否可以保证所有克隆都是唯一的?我的印象是,当我使用equals()
方法进行比较时,创建的每个对象都保证始终有一个新的、唯一的hashcode,它永远不会与另一个hashcode相等
编辑:
我的问题是,使用默认的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());
}
}
公共类应用程序{
公共列表buildCar(字符串类型,int-hp)
{
列表vs=新的ArrayList();
车辆对象=新车();
vObject.SETHORESPOWER(马力);
vObject.setType(类型);
新车辆=新车辆(vObject);
vs.add(newV);
vs.add(vObject);
回报vs;
}
公共静态void main(字符串参数[]){
App ap=新App();
列出车辆=新的ArrayList();
车辆.addAll(ap.buildCar(“car”,100));
车辆v1=车辆。获取(0);
车辆v2=车辆。获取(1);
System.out.println(v1.equals(v2));//打印错误。
//System.out.println(v2.hashCode());
}
}
这是错误的。hashCode()
函数返回一个int
。因此,在创建2^32+1
对象时,至少有一个哈希代码会出现两次
默认情况下(如果不覆盖hashCode()
函数),对象在内存中的地址将作为哈希代码。这就是为什么你会觉得它是独一无二的。您没有创建足够的对象来分配足够的内存以获得两个相等的哈希代码
如何确保通过克隆生成的对象实际上是完全独立和唯一的 独立性和独特性是不同的标准 独立性仅仅意味着对象及其克隆不共享状态。因此,如果(例如)您的
车辆
对象具有可变组件,您需要确保克隆
方法也克隆组件
唯一性需要更多的信息。具体来说,这取决于您使用什么作为唯一性的“测试”
- 如果您使用
作为唯一性测试,则创建新对象的=
克隆的任何实现都将满足要求。(克隆的正常期望是它将创建一个新对象…)
- 如果使用
作为唯一性测试,则这取决于如何定义equals
方法。equals
的默认实现使用equals
。如果重写=
以基于对象字段进行测试,那么如果希望克隆是唯一的(根据equals
),则需要某种标识符字段作为对象标识。。。并安排您的equals
方法为每个克隆提供一个新的标识符值。(这意味着仅仅授权给clone
是不够的。)Object.clone()
我的问题是,使用默认的equals()方法比较100000个克隆是否可以确保每个克隆都是唯一的,并且equals()总是返回false 是的。。。对于
clone()
的任何合理实现
Java
equals(Object)
的默认实现执行与Java=
相同的测试,并且只有当两个操作数是相同的对象引用时,才会给出true
。equals方法始终以100%的准确度区分相等(无论这意味着什么)和不相等。只有当哈希代码不匹配时,比较哈希代码才保证表示“不相等”——相等的哈希代码并不表示“相等”为真
hashcodes的一条牢不可破的规则是,如果两个对象为“equal”返回true,则它们的HashCode必须匹配。如果使用任何正确的
克隆
实现,则结果是一个与原始对象不同的对象(即original.clone()!=original
)
对象的equals
实现检查对象是否相同(返回值与for==相同),即只要正确实现了clone()
,克隆不会返回true。
基本上你可以把o.equals(o2)看作是一个检查,如果变量o和o2引用的两个对象占用相同的内存。(仍在谈论非重写的equals实现)
因此,如果您使用equals进行检查,克隆和原始将两两不同。哈希代码并不意味着是唯一的,只有合理实用的
。equals()方法默认情况下是否使用哈希代码检查相等性?如何使用equals()等方法确保在java代码检查中克隆是独立的?请阅读每个方法的javadoc。您的equals()
(指示其他对象是否与此对象“相等”。
)不应在内部使用hashcode()
(返回对象的哈希代码值。
)。是的,但请查看文档对equals()的说明方法:请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码。
基本上我的问题是:我可以依赖默认的equals()吗方法在使用它比较100000个克隆与