Java-0016-==、hashCode和equals

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)