关于java中Object类中的equals()和hashCode()方法的使用个人总结

1 这两个方法都是来自java.lang.Object类,在Object中hashCode()返回的是对象的地址值,equals()方法是对两个对象的地址进行的比较;如果equals()方法的返回值相同,说明两个对象的地址值也是相同的,所以hashCode()的返回值也是相同的。

2在向集合(如HashSet,TreeSet等)中添加元素的时候遵循的规则是:

   A 判断对象的hashCode的值是否相同,如果不相同,认为这两个元素不相同,如果相同,转入B。

   B判断两个对象的equals运算的值是否相同,如果不相同,认为两个对象是不相同的,

如果相同认为两个对象是相同的。

3 在向封装类的对象中添加元素的时候,由于封装类已经重写了hashCode()和equals()方法,

所以这里使用的是封装类自己重写的两个方法。所以只要存入的内容相同就认为是相同的对象。

4 向集合中添加自定义类的对象时,如果自定义类没有重写equals()和hashCode()方法,就会调用Object的这两个方法,也就是hashCode()方法产生一个hashCode值(永远不会相同的地址),再使用equals()方法进行比较(地址);所以可能会产生向集合中添加已有的对象的时候,由于两次产生的hashcode值是不同的,equals()方法认为这两次添加的不是相同的元素,从而造成了集合对象中有重复的元素出现。解决的方法是:重写自定义类的这两个方法。

5 hashCode()方法经常和散列集合一起使用(HashSet,HashMap,HashTable),

如果集合中不允许有重复的元素,如果采用equals()进行比较的话,会产生效率问题。

所以使用hashCode()方法,在添加元素的时候就进行保证元素的唯一性。

6 如果一个类重写了equals()方法,则一定也要重写hashCode()方法,原因是:虽然equals()方法重写可以保证正确判断两个对象在逻辑是否相同,但是hashCode()方法映射的物理地址是不相同的,依然会将逻辑上相同的两个元素存入集合,但是第二个对象的内容会是Null.

猜你喜欢

转载自www.cnblogs.com/nesnes/p/9863664.html