1、Object若不重写hashCode()的话,hashCode是如何计算出来的?
答:默认情况下,Object中的hashCode() 返回对象的jvm内存地址进行映射。也就是说如果对象不重写该方法,则返回相应对象的JVM内存地址。源码如下:
public native int hashCode();
new People("Jack", 12)和new People("Jack", 12)表面看相同,但确是两个实例对象,地址不同,所以两者的hashCode不相同。
根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。
2、Object若不重写equals()的话,equals()方法是如何比较的?
答:直接比较两个对象是否相等,通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
注:若是基本数据类型,==和equals比较的都是值。
若是对象,==比较的是地址,equals比较的是值。
3、hashCode和equals的关系?
若两个对象的hashCode相等,则equals不一定为true。
若equals为true,则两个对象的hashCode一定相等。
4、若重写equals()方法需要注意哪些问题?
1)自反性:x.equals(x)一定返回true
2)对称性:x.equals(y)返回true当且仅当y.equals(x)
3)传递性:x.equals(y)且y.equals(z),则x.equals(z)为true
4)一致性:若x.equals(y)返回true,则不改变x,y时多次调用x.equals(y)都返回true
5)对于任意的非空引用值x,x.equals(null)一定返回false。
6)若重写equals方法,一定要重写hashCode方法。否则相等对象(equals返回true)可能具有不同的散列码。
equals重写举例:
@Override
public
boolean
equals(Object obj) {
// TODO Auto-generated method stub
return
this
.name.equals(((People)obj).name) &&
this
.age== ((People)obj).age;
}
5、若重写hashCode()方法需要注意哪些问题?
重写hashCode方法,让equals方法和hashCode方法始终在逻辑上保持一致性.\
@Override
public
int
hashCode() {
// TODO Auto-generated method stub
return
name.hashCode()*
37
+age;
}