请认真看我的问题:
我仔细看了一下这四句话,得出来的结论:
1. object.equals 比较的是引用内容,应用内容相等,肯定是同一个对象或者说对象相等。
2. Hashcode算法的对象是和对象的信息本身和地址有关,不是单一的和地址有关。
因为如何只和地址有关,肯定是和equals同步的
【1】 object.equals 比较的是引用内容,应用内容相等,肯定是同一个对象或者说对象相等。
不一定,,比如
String a = new String("ABC");
String b = new String("ABC");
System.out.println(a.equals(b));//true
System.out.println(b.equals(a));//true
System.out.println(a==b);//false
【2】Hashcode算法的对象是和对象的信息本身和地址有关,不是单一的和地址有关。
hashcode和物理地址没关系,只是一种约定,并非强制性的。主要是为相关哈希集合及运算服务的。
public native int hashCode();//源码中是一个本地方法
有个例子,,连个对象不一定相等,但是hashCode相等。(数字可能不一样但是,相等)
String a = new String("ABC");
String b = new String("ABC");
System.out.println(a.hashCode());//64578
System.out.println(b.hashCode());//64578
假定我现在有一个数组 A[] arr = new A[11],我想向其中存储一系列的A对象,我的要求是取的时候特别方便,不用循环,可以直接找到对象的位置,那应该怎么做呢~?
对于一个对象A a , 如果我可以通过某种固定的算法f得到一个值hashCode , 那么我就可以通过这样的方法把A放入数组:
int index = hashCode % arr.length
通过这个算法得到一个索引,因为是模arr.length ,那么这个索引肯定是大于等于0小于arr.length 的,我可以把对象a放入数组arr[index]中,
这样如果我需要从数组中取出a,我就不用遍历数组去一个个找a在哪个位置,我只用再一次使用上面那个算法,算出索引,通过这个索引,我就可以直接拿到a了。
这就是hashCode存在的意义。
接下来说为什么重写了equals 还要重写 hashCode,假定现在有这样的场景
两个对象 A a 和 A b,在我们的场景中我们可能需要重写equals, 判定如果 a 的 属性 name 和 b 的属性 name相等,那我就认定a,b是相同的对象,在向数组 arr里存的时候,我就不能再存多个,只存一个。但是 我们是用hashCode()去计算a,b的位置,默认从Object继承来的hashCode是基于对象的ID实现的 , 也就是说可能这两个对象在我们重写了equals()之后认为是相同的对象,但是hashCode()却不一样,在向数组里存的时候,被判定为不同的对象存到不同的索引中去了,所以我们需要重写hashCode()方法,使得如果我们重写的equals()判定两个对象是相同对象的话,那他们的hashCode()也要返回相同的数值。