参考了博客园:尐鱼儿:https://www.cnblogs.com/yuyu666/p/9733572.html 我只是做了个总结:
首先需要了解一大堆前提:
1,没有重写的equals方法,和==一样,比较的是对象变量中存储的地址指针,重写的equals方法,比较的是地址指针指向的值是否一致,
Point p1 = new Point(3, 3);
Point p2 = new Point(5, 5);
Point p3 = new Point(3, 3);
System.out.println(p1.hashCode());//933699219
System.out.println(p3.hashCode());//2084435065
System.out.println(p1.equals(p3));//false
//重写了equals方法和hashCode方法
System.out.println(p1.hashCode());//1057
System.out.println(p3.hashCode());//1057
System.out.println(p1.equals(p3));//true
2,hashCode方法,是使用hash算法加上地址指针生成的一个值,没有重写hashCode只能保证地址指针相同的两个对象变量的hashCode是一样的
重写后的hashCode方法,是使用hash算法加上地址指针加上对象的属性值、生成的一个值,,重写的后的hashCode方法则可以保证即使两个对象变量的地址指针不相同,他们的属性值完全相同的hashCode也是一样的。
3,在HashSet中不允许出现重复对象,重写的hashcode方法只在hash使用hash算法的集合:列如HashSet中才有用,
4,在HashSet中不允许出现重复对象,元素的位置也是不确定的。在HashSet中又是怎样判定元素是否重复的呢?
判断两个对象是否相等的规则是:
1),判断两个对象的hashCode是否相等。
如果不相等,认为两个对象也不相等,完毕,如果相等,转入2
2),判断两个对象用equals运算是否相等。
如果不相等,认为两个对象也不相等 。
好了根据前提:3,我们向HashSet<Point>集合中存储对象:
Point p1 = new Point(3, 3);
Point p2 = new Point(5, 5);
Point p3 = new Point(3, 3);
Collection<Point> collection = new HashSet<Point>();
collection.add(p1);
collection.add(p2);
collection.add(p3);
collection.add(p1);
System.out.println(collection.size());//输出2,此时p1和p3是相等的
//未重写的equals方法和hashCode方法
我们想要的结果是:System.out.println(collection.size());//输出 2,
如果equals没有重写的话:System.out.println(collection.size());//输出 3 ,
因为:上面的前提:1,所以我们重写了equals,然后测试:System.out.println(collection.size());//输出 3 ,
为什么?原因是前提:4,所以我们需要重写hashCode方法,
然后得到我们想要的结果:System.out.println(collection.size());//输出2,此时p1和p3是相等的
总结:如果我们使用底层实现是hash算法的集合存储对象,为了保证对象不重复,所以需要重写equals方法后,一定重写hashCode方法!