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


    一、 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码不一样。

  • 相关阅读:
    初步学习“C#中is,as用法”(转载)
    SQL 语句性能调优
    算24点,给出四个数字,算出所有组合
    企业信息化实施先松后紧
    解决Json的DateTime格式问题
    Hadoop安装记录
    Test Blog by using windows live writer
    EL表达式获取对象属性的原理
    spring配置文件中配置sessionFactory失败
    Visual Studio 使用Web Deploy 3.6发布项目
  • 原文地址:https://www.cnblogs.com/rootcz/p/9439018.html
Copyright © 2020-2023  润新知