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 接口中使用比较器构造方法。
本文深入解析Java中的equals、hashCode、toString、clone方法及Comparable接口的实现原则,强调了覆盖equals和hashCode方法的重要性,以及toString方法的实用性,同时讨论了clone方法的正确使用方式。
176万+

被折叠的 条评论
为什么被折叠?



