==和equals区别

1、对于基本数据类型,“==”比较的是两者的值是否相等

2、对于引用类型,“==”比较的是引用地址是否相同(即是否是同一辆汽车,注意:只有一辆汽车)

3、(1)Object中的equals()方法和“==”功能一样

public boolean equals(Object obj)指的是其他某个对象是否与此对象相等。

返回true值的equals需要满足:

对于任何非空引用值x,y,z

自反性:x.equals(x)都应返回true

对称性:x.equals(y)返回true,则y.equals(x)返回true

传递性:x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)返回true

一致性:多次调用x.equals(y)始终返回true或者false

对于任何非空引用值x,x.equals(null)都应返回false

(2)但是,String类中的equals()覆盖了Object类中的equals(),重写了equals()方法,比较的是两个引用对象的内容是否相同(即是都是完全相同的汽车,注意,有两辆汽车,且一模一样,完全相同)。

4、HashCode

返回一个int类型。

Java中的HashCode方法是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称为散列值。

两个对象equals为true,HashCode一定相等。两个对象equals为false,HashCode也可能相等。所以不可以根据HsahCode值判断两个对象的值相等,但是可以判断两个对象的值不相等。

注意:在重写equals方法的同时,必须重写HashCode方法。默认情况下,HashCode方法是将对象的存储地址进行映射。重写HashCode方法,让equals方法和HashCode方法始终在逻辑上保持一致。

考虑一种情况,当向集合中插入对象是,如何判别在集合中是否已经存在该对象了?(注意集合中不允许重复的元素存在)

如果集合中已经存有一万或更多的数据,采用equals方法去逐一比较,效率会很低。此时,可以选择先调用这个插入对象的HashCode方法,得到对应的HashCode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的HashCode值,如果table中没有该HashCode值,它可以直接存进去,不用再进行任何比较了;如果存在该HashCode值,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一类实际调用equals方法的次数就大大降低了。

部分参考

https://blog.csdn.net/g_66_hero/article/details/71081315

https://www.cnblogs.com/dolphin0520/p/3681042.html

猜你喜欢

转载自blog.csdn.net/Alice_0_0/article/details/80654357
今日推荐