美文网首页七七八八zi打印
Java-0016-==、hashCode和equals

Java-0016-==、hashCode和equals

作者: 云转水流 | 来源:发表于2016-07-28 19:17 被阅读36次

    2016.7.28

    ==与equals()

    当比较的类型是基础数据类型时,只能用==,比较的就是他们的值。
    当比较的类型是引用数据类型时,==和未重写的equals()完全一样,比较对象的地址,即它们是不是同一个对象。(未重写的equals()指Object类中的equals方法)

    但是,
    equals()方法是可以被覆写的,因为被覆写所以例如String类型用equals()比较时,比较的也是内容是否相同,而不是是否是同一个对象。
    (其实我感觉==可能也能重写,只是==应用的范围比equals()大的多,重写的话严重影响其他地方==的使用)

    hashCode()和equals()

    它们在Collection类,即集合中用的较多。
    虽然所有实例类都继承了Object类,都有了hashCode()和equals()方法,但有时候并不能满足我们的需求,这时候我们就需要去重写它们。
    注意重写了equals()就一定要重写hashCode(),因为判断时一定是先判断hashCode(),若hashCode()相同再判断equals()(下面会再详细说明)。重写时要保持它们的逻辑一致。

    为什么判断了hashCode()还要再判断equals()呢?

    hashCode()得到的可以说是一个实例对象的唯一标识符,但是,这个标识符是可能存在冲突的,即可能会存在两个相同类的不同实例对象,但它们hashCode()的值相同(这个可能性很小,但存在)。
    这时候我们就需要equals()来进行最终的判断,判断两个对象的属性是否相同(可以自己定义条件)。

    那既然有了equals()来进行精准的判断了,为什么还要hashCode()呢?

    因为equals()的判断虽然精准,但若是你已经有1000个数据了,这时要存入一个新数据,那就需要进行1000次equals(),效率低下。
    而用hashCode()就可以一下定位到它应该放置的物理位置上,如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 就调用equals()方法再进行比较,相同的话就不存了,不相同就散列其它的地址。这样一来效率大大的提升了。

    相关文章

      网友评论

        本文标题:Java-0016-==、hashCode和equals

        本文链接:https://www.haomeiwen.com/subject/daiajttx.html