hashCode(),equal(),==的理解

1.hashCode()和equals()

区别:
1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。

2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

3.效率比较
因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,

那么hashCode()既然效率这么高为什么还要equal()呢?

实际的使用中,一个对象一般有key和value,可以根据key来计算它的hashCode。假设现在全部的对象都已经根据自己的hashCode值存储在不同的存储区域中了,那么现在查找某个对象(根据对象的key来查找),不需要遍历整个集合了,现在只需要计算要查找对象的key的hashCode,然后找到该hashCode对应的存储区域,在该存储区域中来查找就可以了,这样效率也就提升了很多。

什么时候需要重写equals和hashCode?

一般来说涉及到对象之间的比较大小就需要重写equals方法,实际上这只是一条规范,如果不这样做程序也可以执行,只不过会隐藏bug。一般一个类的对象如果会存储在HashTable,HashSet,HashMap等散列存储结构中,重写equals后最好也重写hashCode,否则会导致存储数据的不唯一性(存储了两个equals相等的数据)。而如果确定不会存储在这些散列结构中,则可以不重写hashCode。

2.==和equals()的

1.直接比较的是堆内存的地址,如果相等,说明两个的引用实际是同一对象地址值
2.equest在Object中定义,实际就用到了’==’
,equest在Object中定义,所有的类直接或间接的继承Object,所以可以通过重写equest,使得该对象不仅能比较地址值,(地址值相等时)还能比较对象中的成员属性

总而言之:比较类里面的数值是否相等时,用 equals()方法;当测试两个包装类的引用是否指向同一个对象时,用 ==。

2.1延伸

比较基本数据类型的常量,实际是比较常量池中的地址,因为一个常量对应一个地址,当然要满足类型的取值范围,如下结果

Integer i1=127;
Integer i1=127;
System.out.println(i1==i2);

Integer i1=128;
Integer i1=128;
System.out.println(i1==i2);

结果是 ture,false,当超出基本数据类型取值范围,会在堆内存开辟新的空间来存储

参考文献:https://blog.csdn.net/lcsy000/article/details/82782864

猜你喜欢

转载自blog.csdn.net/qq_18361601/article/details/106757340