首先我们来看一下hash算法的原理:哈希算法就是将你的集合分成若干个区域,每个对象可以计算出一个哈希码,可以讲哈希码分组,每组分别对应某个区域,根据哈希码就能知道你的对象时在哪一个区域里面的
然而呢 HashSet就是按照哈希算法来存取对象的集合,往里面放对象的时候他会判断集合里面有没有这个对象如果有就不让放
但是注意一点,你这个类的对象必须保证同时实现了Object的hashcode方法和equals方法,为什么呢 给你举个例子
Collection collection = new HashSet();
ReflectPoint p1 = new ReflectPoint(3,3);
ReflectPoint p2 = new ReflectPoint(4,5);
ReflectPoint p3= new ReflectPoint(3,3);
collection.add(p1);
collection.add(p2);
collection.add(p3);
这是一个hashset集合,本来我们应该把p1和p3看成是相等的是吧,但是我们打出来的集合的大小却是3
为什么呢 这就是为什么要覆盖Object的hashcode方法和equals方法了,因为他的返回值是通过
对象的内存地址推算出来的,同一个对象在运行期间的任何时候一返回的哈希值都是始终不变的,所以只要是两个不同的实例
对象,即使他们的equals方法比较结果相等。他们的默认hashcode方法 的返回值也是不同的
所以当我们重写equals方法的时候,判断两个对象啊为真,但是却还是打印结果为3,就是因为没有重写hashcode方法而是用的Object的hashcode方法,导致两个对象的
hashc值不一样 所以就能存进去了,所以这就是hashcode的作用在hashset中的作用,因为有了hashcode方法,hashset中才不会出现元素的重复
只要记着:当你覆盖了equals方法的时候,一定要覆盖hashcode方法,不然即使你比较equals的方法相等,但还是hashcode值还是不一样额,必须保证equals方法的值为true时。
hashcode的值的比较野必须为true |