重写hashCode()和equals()方法详细介绍
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下 在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。当自定义类时,有时需要根据业务逻辑重写这两个方法以满足特定需求。 我们来详细了解`equals()`方法。`equals()`方法用于比较两个对象是否“相等”。默认的`equals()`行为是基于引用的相等性,即只有当两个引用指向内存中的同一个对象时,`equals()`才返回`true`。如果需要基于对象的内容或属性进行比较,就需要重写`equals()`。重写`equals()`时,应遵循以下原则: 1. **自反性**:对于任何非null的引用值x,x.equals(x)应该返回true。 2. **对称性**:如果x.equals(y)返回true,那么y.equals(x)也应该返回true。 3. **传递性**:如果x.equals(y)和y.equals(z)都为true,那么x.equals(z)也应该返回true。 4. **一致性**:如果对象状态不变,多次调用x.equals(y)应始终返回相同结果。 5. **与null的比较**:对于任何非null的引用值x,x.equals(null)应返回false。 接下来,我们来看`hashCode()`方法。`hashCode()`返回对象的一个整数值,用于哈希表中定位对象。两个相等的对象(根据`equals()`定义)应该有相同的哈希码。因此,当重写`equals()`时,通常也需要重写`hashCode()`,以保持两者的一致性。不这样做可能会导致哈希表的行为异常,例如在HashSet中,即使两个对象相等,也可能无法正确识别它们。 例如,假设我们有一个`Coder`类,包含`name`和`age`属性。如果我们重写了`equals()`方法来基于`name`和`age`判断两个`Coder`对象是否相等,那么我们也应该重写`hashCode()`,使具有相同`name`和`age`的`Coder`对象产生相同的哈希码。通常,`hashCode()`的实现会结合所有参与比较的字段,使用位操作或者乘法来生成一个整数值。 ```java @Override public int hashCode() { int result = 17; result = 31 * result + (name != null ? name.hashCode() : 0); result = 31 * result + age; return result; } ``` 这里,17和31是常量,选择它们的原因是它们是素数,有助于减少哈希冲突。对于每个字段,我们将其哈希码与当前结果相乘,然后加上该字段的哈希码。这确保了不同的字段组合会产生不同的哈希码。 如果不重写`hashCode()`,当两个`equals()`相等的对象被放入HashSet或其他基于哈希的集合时,可能会出现意外的结果,因为哈希码不同,集合可能无法识别这些对象是相同的,从而导致错误的添加或查找行为。 重写`equals()`和`hashCode()`是Java面向对象编程中常见的做法,特别是在创建自定义类并希望基于对象的属性而不是引用进行比较时。遵循上述原则和最佳实践,可以确保代码的正确性和效率。
- 粉丝: 6
- 资源: 967
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip
- 1
- 2
前往页