== , equals , hashcode()的区别:
基本数据类型:比较用==, 比较他们的值
复合数据类型:用==比较时,比较的是它们在内存中存放的地址,除非是同一个new出来的对象,他们的比较后果为true,否则为false。
object基类中定义了equals()方法,它的初始行为是比较它们的内存地址(就是和==功能一样),但在有些类库中覆盖了,比如String类的equals()方法是比较它们的内容。equals()方法在object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以看出,equals是比较两个对象的地址是否相同。但是String, double等类已经重写了equals方法,它们比较的是对象的内容是否一致。
public native int hashCode();
说明是一个本地方法,它的实现是根据本地机器相关的。很多类都覆盖了这个方法,例如String类覆盖了这个方法,根据它的内容计算出一个哈希值。
两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。
那么equals和hashcode的关系是什么:
1. 如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
2. equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的);
3.hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。