简述覆盖Object的通用方法

本文深入解析Java中的equals、hashCode、toString、clone方法及Comparable接口的实现原则,强调了覆盖equals和hashCode方法的重要性,以及toString方法的实用性,同时讨论了clone方法的正确使用方式。

Object类主要提供了equals、hashCode、toString、clone等通用方法,下面一一简述一下关键点。

equals方法
  • 如果有些对象的equals比较的是是否为同一引用,那么可以不复写该方法,Object中的equals已经支持,因此记住,除非迫不得已,否则不要轻易覆盖equals方法。
  • 覆盖equals方法的场景:你需要从业务逻辑上去判断2个对象是否相等;该对象被放置到常用的数据结构中,比如List和Map,当key集为该对象类型时,在使用contains等方法时需要确保对象正确重写了equals方法。
  • 覆盖equals方法遵循的约定:
    1.自反性:(x非null)x.equals(x) return true;
    2.对称性:(x,y非null)x.equals(y) return true,那么y.equals(x)也必须return true;
    3.传递性:(x,y,z非null)x.equals(y)和y.equals(z) return true,那么x.equals(z)也必须return true;
    4.一致性:(x,y非null)多次调用x.equals(y)返回结果相同;
    5.非空性:x.equals(null)必须return false。
  • 习惯:
    1.覆盖equals总是要覆盖hashCode
    2.equals方法不应该过于复杂或太智能;
    3.重写equals方法,传参必须是Object,不要试图改成具体的类型。
hashCode方法
  • 覆盖场景:当你需要覆盖equals方法时,必须覆盖hashCode方法,否则将导致该类无法结合所有基于散列的集合(也就是各种HashMap、HashSet等)。
  • 当2个对象的equals方法(尤其是有特殊相等逻辑时)相等,那么要确保它们的hashCode方法的返回值相等。
  • 2个对象的equals方法不相等时,hashCode的返回值不一定会不相等,所以要求开发者设法实现让它们的hashCode的返回值不相等
toString方法
  • 建议始终覆盖这个方法,这样会方便调试,尤其是在直接打印某个对象时,或者某个列表里的对象元素时,会自动调用toString方法。
clone方法
  • 其中一种覆盖场景:实现了Cloneable接口的类都应该覆盖clone方法,并且是共有的方法,它的返回类型是类的本身。
  • x.clone() != x
  • x.clone().getClass() == x.getClass()
  • 实际上clone就是另外一个构造器,必须确保它不会破坏原始的对象,并遵循上面的条件。
  • 该方法应该先调用父类clone方法。
  • 一般情况尽可能不要使用Cloneable和clone方法,有很多别的途径可以实现对象拷贝,比如静态工厂方法,但是在数组拷贝时,利用clone方法是最佳途径。
实现Comparable接口
  • 每当实现一个对排序敏感的类时,都应该让这个类实现 Comparable 接口,以便其实例可以轻松地被分类、 搜索,以及用在基于比较的集合中(比如Array.sort方法)。 每当在 compareTo 方法的实现中比较域值时,都要避免使用 < 和>操作符,而应该在装箱基本类型的类中使用静态的 compare 方法(比如Integer.compare方法,而不是使用大于号或小于号自己比较),或者在 Comparator 接口中使用比较器构造方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值