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