【equals和==的区别?和equals及hashCode 为什么重写要一起重写 _spring _mybatis 】 | IT修真院·坑乎
equals和==的区别?和equals及hashCode 为什么重写要一起重写
我也踩过这个坑( 1 )
已统计您的踩坑,无需重复点击
回答(1)
spring mybatis
详细描述
编辑于2024-05-18
  • [郑州|荣耀师兄]JAVA-茹程远
    0
    从object 里的equals,就是用 == 来实现的
    对于JAVA基础类型 == 比较的就是 变量真正的值
    对于JAVA自带的包装类型例如String ,Long 等,== 比较的是 内存中的存放地址, 而equals比较的是值。
    对于自定义的类型,equals继承的是object的方法 ,所以比较的是内存的地址。

    string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;


    为什么要重写hashCode ?
    JAVA本身的hashCode( ) 方法 用的本地,作用是返回内存地址。
    equals如果不重写,继承Object,则也比较的是内存的地址
    而且hashCode 有以下规则:
    1. 1.在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。      
    2. 2.如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。      
    3. 3.如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能
    在hashMap,HashSet里比较key时关键代码如下:
    if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))
    需要比较key的hash值,key是否相等(==),key比较(equals)
    所以如果两个key-value 的值相等,但分配不同的内存空间。如果只重写了equals方法,比较了key的值相等,但是hashCode返回不同的内存地址,计算后得到不同hash ,那么就错误的认为这是两个值不同的key-value ,但其实是一样的。


    编辑于2018-03-27