Object类中的equals方法和hashCode方法

今天在看java集合的数据结构时看到,关于equals()方法和hashCode()方法的知识点时,发现脑子一空,很慌,回来赶快补一波

equals方法的几大特征:
1.自反性 : x.equals(x) 结果应该返回true。
2.对称性 : x.equals(y) 结果返回true当且仅当y.equals(x)也应该返回true。
3.传递性 : x.equals(y) 返回true,并且y.equals(z) 返回true,那么x.equals(z) 也应该返回true。
4.一致性 : x.equals(y)的第一次调用为true,那么x.equals(y)的第二次,第三次等多次调用也应该为true,但是前提条件是在进行比较之前,x和y都没有被修改。
5.x.equals(null) 应该返回false。
6.这个方法返回true当且仅当x和y指向了同样的对象(x==y),这句话也就是说明了在默认情况下,Object类中的equals方法默认比较的是对象的地址,因为只有是相同的地址才会相等(x == y),如果没有重写equals方法,那么默认就是比较的是地址。
注意:无论何时这个equals方法被重写那么都是有必要去重写hashCode方法,这个是因为为了维持hashCode的一种约定,相同的对象必须要有相同的hashCode值

    虽然有时候Object的equals()方法可以满足我们一些基本的要求,但是我们必须要清楚我们很大部分时间都是进行两个对象的比较,这个时候Object的equals()方法就不可以了,
实际上JDK中,String、Math等封装类都对equals()方法进行了重写。
在覆写equals()方法时,一般都是推荐使用getClass来进行类型判断,不是使用instanceof。我们都清楚instanceof的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。
注意后面这句话:可以用来判断继承中的子类的实例是否为父类的实现,正是这句话在作怪。

在java中进行比较,我们需要根据比较的类型来选择合适的比较方式:
     1) 对象域,使用equals方法 。 
     2) 类型安全的枚举,使用equals或== 。 
     3) 可能为null的对象域 : 使用 == 和 equals 。 
     4) 数组域 : 使用 Arrays.equals 。 
     5) 除float和double外的原始数据类型 : 使用 == 。 
     6) float类型: 使用Float.foatToIntBits转换成int类型,然后使用==。  
     7) double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。

hashCode方法的特征:
1.在同一次的java程序应用过程中,对应同样的对象多次调用hashCode方法,hashCode方法必须一致性的返回同样的一个地址值,前提是这个对象不能改变
2.两个对象相同是依据equals方法来的,那么其中的每一个对象调用hashCode方法都必须返回相同的一个integer值,也就是对象的地址。equals方法相等,那么hashCode方法也必须相等。
3.如果两个对象依据equals方法返回的结果不相等,那么对于其中的每一个对象调用hashCode方法返回的结果也不是一定必须得相等(也就是说,equals方法的结果为false,那么hashCode方法返回的结果可以相同也可以不相同),但是,对于我们开发者来说,针对两个对象的不相等如果生成相同的hashCode则可以提高应用程序的性能

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值