Java--equals和 == 的比较和equals()、HashCode()的重写

2018/08/07 19:38
阅读数 63

一、 equals和 == 的比较 1、== 运算符 ① == 如果比较的是基本数据类型,则比较的是值。 ② == 如果比较的是引用数据类型,则比较的是地址值。 2、equals ①它属于java.lang.Object类里面的方法,如果该方法没有被重写则等同于==。 ②public boolean equals(Object obj),用于比较两个对象[即引用数据类型]是否相等。 注意:在使用中String的equals方法看似比较的值,其实是String重写了equals方法。 3.基本数据类型的包装类型的equals和==的使用 ①基本数据类型和包装类型进行==比较时候,基本数据类型的包装类型会自动拆箱成基本数据类型,在进行数值比较,包装类型如:Integer a = 300;Integer aa = new Integer(300); int a0 = 300 a0和a、aa比较都是true。 ②两个包装类型进行比较,如果期中一个封装类型是new出来的,二者进行比较返回false;如果过两个都是new出来的,则返回false,比较的是二者的地址。 ③integer类型在-128----127非new 的值,从常量池中取,超出范围的用new获取。Integer a = 127,Integer aa = 127,a和aa进行==比较,得到true,Integer b = 128, Integer bb = 128, b和bb进行==比较,返回false。 ④基本数据类型的封装类型调用equals(c)方法时,如果c是基本数据类型,c自动装箱,然后进行比较,如果类型一致比较值相等返回true,如果类型不一致返回false。Integer类重写了equals方法,比较类型和值。其他基本类型也一样!

二、 ==、equals、HashSet的使用 案例: 1、==比较的是new出来的对象,因此比较的是地址值,所以比较结果是false 2、a.equals(a2)调用的是String的equals()方法,由于String重写了equals的方法,所以这里比较的是值。 3、HashSet其实就是HashMap,HashMap其实就是比较的key的hashcode值,存入的values是常量值。 String重写了equals因此有相同的hashcode码,所以对hashSet就是一个值。会覆盖存储! 4、对于Person类没有重写equals()方法则,继承了Object的equals方法,比较的是地址值,所以new出来的是两个不同的对象,具有不同的hashcode码,HashSet的size值为2。16进制地址值不同。

三、 重写equals()方法时要重写HashCode()方法,31的含义? 1.在重写equals方法的类中,必须重写hashCode方法,如果不重写的话就会违反Object和hashCode的通用约定,导致无法结合所有基于散列码的集合一起正常运作,例如:HashMap、HashSet、HashTable。当一个类有自己特有的逻辑相等的概念,一个类的equals放发改写后,两个截然不同的实例,可能在逻辑上是相等的,根据Object.hashCode()方法,它们仅仅是两个对象。 违反了:相等的对象必须具有相等散列码。 因此:重写equals()时需要同时重写hashCode()方法。 2.hashCode中31的选取理由 ①减少hash冲突,31是一个奇素数 ②任何数a*31就可以被JVM优化为(a<<5)-a,移位和减法的效率要比乘法操作效率高的多,对于左移虚拟机中有相关优化。并且31只占用5bits。

四、 equals()和hashCode()重写 1.equals的重写步骤 ①地址值相等,是同一个对象,是其本身 ②判断是不是【所用对象】类型的对象 ③比较需要比较的字段,string类型用equals,基本数据类型用==即可,如果是多个值进行比较,则用&&符号连接 2.hashCode的重写 重写之后的结果: 注意:如果不重写hashcode()会有地址值一致,hashcode的值不一致的情况,就是逻辑相等的情况,其实hashCode码不一样。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部