下列情况是不需要改写equals方法的:
-
同一个类的不同实例本质上是唯一的,就是个实例都有自己的本体(Identify)。
- 不关心该类是否提供了逻辑相等的功能。
- 父类已经改写过equals方法,对于子类来说,继承过来的equals方法已经是最合适的了。
- 一个类是私有的或者是包可见的,且确定它的equals方法不会被调用。
对于需要改写equals方法的时候,应该遵守如下约定:
-
自反性,即x.equals(x)为true.
- 对称性,即当且仅当x.equals(y)为true时y.equals(x)也一定为true。
- 传递性,即对任意的x,y,z,如果x.equals(y)为true,并且y.equals(z)也为true,那么x.equals(z)也必须为true。
- 一致性,即对于任意的x,y,如果x,y都没有被修改的话,那么多次调用x.equals(y)要么一致地返回ture,要么一致地返回false.
- 对于非空的引用x,x.equals(null)一定要返回false.
改写equals方法时的建议:
-
用==操作符检查实参是否为指向对象的同一个引用。
- 使用instanceOf检查实参是否是正确的类型。
- 在2的基础上,把实参转换成正确的类型。
- 检查实参的域与当前对象的域值是否相等。
- 编写完equals方法后,检查是否满足等价关系。
例如:
public boolean equals(Object o)
{
if(o== this) return true;
if(!(o instanceof xxxx) return false;
xxx in = (xxx)o;
return ……..
}
改写equals方法的告诫:
-
不要企图让equals方法做太多事。
- 不要使equals依赖不可靠的资源,否则会违背一致性。
- 不要将equals中的对象装换为其他的类型。
- 要注意的时候不要提供这样的方法public boolean equals(MyClass o)这样是重载并不是覆盖Object的equals方法。
总结:不用重写equals方法就尽量不要去找麻烦,确实需要改写equals方法时,遵守通用约定,因为对象会在程序中不停的传递,所以可能会导致程序运行不正常,甚至崩溃而很难找到程序崩溃的原因。总之,还是遵守约定吧!
分享到:
相关推荐
《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...
1. **覆写equals时遵守通用规定**:重写`equals()`时,应遵循“ Reflexive、Symmetric、Transitive、Consistency 和 Non-null”五原则,同时必须与`hashCode()`一起覆写。 2. **覆写hashCode**:确保相等的对象有...
### Java学习笔记知识点总结 #### 第一章:Java语言入门 - **1.1 Java的诞生** Java由Sun Microsystems公司于1995年推出的一种可移植、面向对象的编程语言。最初的设计目标是为消费电子产品提供一种通用编程语言...
3. 访问控制权限可以不同,但是子类重写父类的方法时,访问控制权限必须大于父类。 例如,public boolean equals(Object o) 是一个正确的重写方法,而 public boolean equals(String o) 是一个重载方法,而不是重写...
2. **重写equals()和hashCode()**:Bloch建议当重写equals()方法时,也应同时重写hashCode(),以确保对象在散列结构(如HashSet或HashMap)中的行为正确。 3. **枚举代替常量类**:书中推荐使用枚举类型替代传统的...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程指导原则,帮助开发者写出更高效、更可维护的代码。这本书分为多个条目,每个条目都深入探讨了一个特定的Java编程实践...
### Java中equals方法隐藏的陷阱 在Java编程中,正确实现`equals`方法至关重要,它不仅影响对象的比较逻辑,还直接关系到集合类(如`HashSet`、`HashMap`等)的行为。本文将深入探讨Java中`equals`方法的一些常见...
### Java实战经典学习笔记知识点概览 #### 一、Java概述及开发环境搭建 - **Java概述** - Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年发布。 - Java的设计目标是“一次编写,到处运行”,这...
6. **重写equals()和hashCode()方法(Overriding equals() and hashCode())**: 代码展示了如何正确实现这两个方法以遵循合同,尤其是在实现集合类时的注意事项。 7. **接口与抽象类(Interfaces vs Abstract ...
1. **多态应用**:多态性允许我们使用一个类型的引用指向它的子类型实例,这样在调用相同的方法时,会根据实际的对象类型执行不同的操作。这种现象在程序设计中非常常见,例如在处理不同类型的动物时,虽然都具有...
### Java学习笔记知识点详解 #### 一、Java面向对象编程思想 面向对象编程(Object-Oriented Programming, OOP)是Java的核心特性之一。通过封装、继承和多态这三个基本特征来实现。OOP能够提高代码的复用性和可...
在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...
JAVA学习笔记整理全面涵盖了从基础语法到高级技术的多个领域,包括数据库管理、Web服务器、缓存技术、框架、容器、网络、虚拟机、操作系统、数据结构和操作系统等多个方面。以下将详细介绍其中的关键知识点。 一、...
Java是一种广泛使用的面向对象的编程语言,其基础知识是学习Java编程的基石。下面将详细讲解在给定的学习笔记...这些是学习Java编程时的基础内容,深入理解和熟练运用这些知识将有助于进一步学习更复杂的Java编程技术。
在编程领域,特别是Java开发中,"Effective Java"是一本非常经典的书籍,由Joshua Bloch撰写,书中提出了一系列最佳实践和设计原则,以帮助开发者编写出更高效、更安全的代码。根据提供的标题和描述,我们将探讨三个...
### JAVA学习笔记(全面) #### 一、Java技术基础 ##### 1.1 编程语言 编程语言是计算机能够理解和执行的一种指令集。根据不同的编程思维和应用场景,编程语言可以分为以下几类: - **机器语言**:由二进制代码...