初学者: 请非常通俗的解释:
我把HashCode理解为是大楼的本牌号,真实地址是经纬度。
经纬度不可变,但是大楼的门牌号却是可以变的。
现在请如上通俗的告诉我: 为什么我equals变,HashCode 也要变。
1.我目前知道的就是Object中的equals和HashCode都是最基本的,需要重写。
2. 还知道String类,equals通常是先比较地址,然后一个字符一个字符比较。
还有就是我想知道HashCode存在的意义是什么,不要说什么进程怕被扰乱,我看不懂
初学者: 请非常通俗的解释:
我把HashCode理解为是大楼的本牌号,真实地址是经纬度。
经纬度不可变,但是大楼的门牌号却是可以变的。
现在请如上通俗的告诉我: 为什么我equals变,HashCode 也要变。
1.我目前知道的就是Object中的equals和HashCode都是最基本的,需要重写。
2. 还知道String类,equals通常是先比较地址,然后一个字符一个字符比较。
还有就是我想知道HashCode存在的意义是什么,不要说什么进程怕被扰乱,我看不懂
假定我现在有一个数组 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()也要返回相同的数值。