一、equals()
首先,equals()方法存在于Object类当中,也就意味着所有的类都存在equals方法。那么如果不重写它而直接使用object类当中的equals方法,比较的便是对象的地址值(equals不能比较基本数据类型);如果像String类那样重写过equals方法,那么比较的便是两个对象的内容!
二、hashCode()
hashcode()方法的目的是计算出该对象的哈希码,一个int类型的整数,这个哈希码能够确定该对象在散列表当中的位置(散列表就是像Java集合中本质为散列表的类,如hashmap、hashset、hashtable)。散列表是key-value形式存储数据,能够通过键快速的查到到相应的值。
三、为什么要使用hashcode()
在一些容器当中(比如hashmap、hashset),使用hashcode方法能够通过计算出该对象的哈希值来快速的找出出该哈希值在哈希表当中的位置,并判断出该位置上是否以及存在数据。效率高!缩小查找成本。
但是,两个不同的对象可能会存在相同的哈希值,这类情况成为哈希冲突。在这种情况下,便需要使用到equals方法来再一次判断两个对象的值是否相等。
四、为什么重写equals()的同时还需要重写hashCode()
首先,需要重写这两个方法的情况,必须是在“会创建类所对应的散列表”,也就是,在hashmap、hashset等本质为散列表的数据结构当中会使用到该类!
分情况讨论:
如果只重写了equals方法,此时如果向hashSet当中添加两个对象,首先它会使用Object类当中的hashcode方法计算出两个对象的哈希值,由于Object类的hashcode方法始终返回的是该对象的hash地址,所有两个对象的哈希值不可能相同!,所以这时即便重写了equals方法,也不会有任何效果,因为哈希值不同,就不会再去调用equals方法进行比较!
所以这种情况会使得hashset中出现重复元素!
如果重写equals和hashcode方法,这个时候只有hashcode值相同并且equals返回true时,才会认为两个对象是相同的。
五、为什么hashcod值可能会相同
如果在没有被重写hashcode方法,那么便会调用object类中的hashcode方法,该方法会直接返回对象在堆当中的地址,而不同的对象它的地址肯定是不同的,所以哈希值也肯定不同!
如果有重写hashcode方法,那么便会因为哈希算法的原因,便有可能导致两个对象的哈希值相同!
最后,补充一下:
- 如果两个对象的equals方法返回true,那么它们的哈希值一定相同!
- 如果两个对象的哈希值相同,它们的值却不一定相同!
五、拓展 spring IOC的举例
形象的举例就是: 通常情况下,假如你有一天在家里口渴了,要喝水,那么你可以到你小区的小卖部去,告诉他们,你需要一瓶水,然后小卖部给你一瓶水!这本来没有太大问题,关键是如果小卖部很远,那么你必须知道:从你家如何到小卖部;小卖部里是否有你需要的水;你还要考虑是否开着车去;等等等等,也许有太多的问题要考虑了。也就是说,为了一瓶水,你还可能需要依赖于车等等这些交通工具或别的工具,问题是不是变得复杂了?那么如何解决这个问题呢?
解决这个问题的方法很简单:小卖部提供送货上门服务,凡是小卖部的会员,你只要告知小卖部你需要什么,小卖部将主动把货物给你送上门来!这样一来,你只需要做两件事情,你就可以活得更加轻松自在: 第一:向小卖部注册为会员。 第二:告诉小卖部你需要什么。
这和Spring的做法很类似!Spring就是小卖部,你就是A对象,水就是B对象 第一:在Spring中声明一个类:A 第二:告诉Spring,A需要B