很早就对hashCode和equals方法有疑问了,一直留着没去解决,今天正好想起,所以百度了,但我确实是通过自己的话写的,所以姑且算是原创吧。


HashSet或者HashMap里的值是不能重复的。那么我们来假设,里面已经存放了1000个值了,

下面我要存第1001个值,我怎么判断这1001个值是不是跟前面1000个值是否相等呢?


这时有人会说用equals()方法,是的,可以,但是你要与1000个值都equals一下,那不是很慢嘛?,1000还好,那要是10000呢,100000呢,这就吃不消了。


所以要用到hashCode,就把hashCode当做一个地址值。当你存入数据时,直接找到你hashCode所对应的物理内存,看你里面是不是已经存放一个值了,没存放就直接存放,存放了就调用一下equals方法,如果相等,则丢掉,不等,则与其形成散列筒,一起存放了。


所以,当你创建一个类的时候,你要重写equals方法的时候,你最好也重写hashCode,不然你创了2个属性啊 方法啊都相等的对象,都能插入HashSet或者HashMap,这就可能和你原来的意愿违背了。


还有一点就是hashCode和equals的判断标准应该是一样的,比如,你equals是利用了对象里的2个属性是否相等来判断这个对象是不是相等的,那么你hashCode方法里返回的值也要跟这2个属性有关。

因为你hashCode就是为了不让equals判断那么多次而存在的嘛(可能还有其他更深入的作用)