java equals()用法
时间: 2025-08-30 08:07:50 AIGC 浏览: 21
### Java中`equals()`方法的使用指南
#### 1. `equals()`方法的基础定义
`equals()`是Java中`Object`类提供的一种方法,默认实现是比较两个对象的引用是否指向同一内存地址。这意味着只有当两个变量引用同一个对象时,`equals()`才会返回`true`[^4]。
#### 2. 自定义类中的`equals()`重写原则
在实际开发过程中,往往需要根据业务逻辑来自定义对象之间的相等性判断标准。此时就需要覆盖(override)父类`Object`所提供的默认行为。按照约定俗成的规定以及最佳实践的要求,在编写新的`equals()`版本时应当遵循以下几个准则:
- **自反性**:对于任意非空引用值x而言,表达式`x.equals(x)`应始终为真。
- **对称性**:给定任何一对非空引用值x和y来说,只要`x.equals(y)`成立那么必然也有`y.equals(x)`同样成立。
- **传递性**:假设存在三个非空引用值分别为x,y,z 。如果`x.equals(y)`等于True 并且`y.equals(z)`也为True 的话 ,则意味着`x.equals(z)`必定也是True 。
- **一致性**:多次调用同一个实例上的`equals()`方法传入相同的参数应该总是得到一致的结果,除非该实例所依赖的数据发生了改变。
- 对于任一非空引用值x 来说 , 表达式`x.equals(null)` 应该返回false[^3]。
#### 3. 示例代码展示如何正确地重载`equals()`
下面是一个具体的例子演示了怎样在一个简单的商品(Product)实体类里边适当地实现了`equals()`:
```java
public class Product {
private String name;
private String description;
public Product(String name, String description) {
this.name = name;
this.description = description;
}
@Override
public boolean equals(Object o) {
if (this == o) return true; // 检查是否为同一个对象
if (o == null || getClass() != o.getClass()) return false; // 判断类型是否匹配
Product product = (Product) o;
return Objects.equals(name, product.name) &&
Objects.equals(description, product.description);
}
@Override
public int hashCode(){
return Objects.hash(name,description);
}
}
```
在这个例子当中,我们首先进行了基本的身份验证(`this==o`),接着确认对方是不是null或者是不同种类的对象。最后才是深入比较各个成员变量的内容是否完全吻合。值得注意的是,每当我们在子类里面重新定义了`equals()`之后,一般都需要同步更新相应的`hashCode()`函数以维持两者间应有的联系[^1]。
#### 4. 不恰当的`equals()`可能导致的问题
如果不恰当地实施`equals()`或者遗漏了一些必要的考量因素的话,很可能会引发意想不到的行为。比如前面提到的那个关于Key的例子,如果没有适当设置`equals()`与`hashCode()`的话,即便两个Key对象有着一样的ID值,在HashMap这样的数据结构看来他们依然是不同的键值对,进而造成存取混乱的情况发生[^2]。
---
###
阅读全文
相关推荐


















