hashcode该怎么重写,举个例子
时间: 2023-03-12 20:11:09 浏览: 112
重写hashcode的方法有很多种,但最经典的方法是重新实现 Java 类的equals()和hashCode()方法。例如,可以重写如下代码:@Overridepublic int hashCode() {int result = 1;result = 31 * result + ((name == null) ? 0 : name.hashCode());result = 31 * result + age;return result; }
相关问题
重写equals方法为什么一定要重新hashcode,还有麻烦举个例子说明
重写equals方法一定要重新hashCode方法是因为在Java中,如果两个对象使用equals方法比较相等,那么它们的hashCode值也必须相等。否则,当这两个对象被放入基于哈希表的集合类中(例如HashMap,HashSet等)时,它们会被认为是不同的对象,这会导致哈希表的不正确使用。
举个例子,假设我们有一个Person类,它有两个属性:name和age。我们希望两个Person对象在name和age都相等时被认为是相等的。我们可以这样重写equals方法:
```java
public boolean equals(Object obj) {
if (obj == null) return false;
if (!(obj instanceof Person)) return false;
Person other = (Person) obj;
return Objects.equals(name, other.name) && age == other.age;
}
```
但是,如果我们不重写hashCode方法,那么这个类的两个实例在放入HashMap中时,会被认为是不同的对象。因此,我们需要重写hashCode方法:
```java
public int hashCode() {
return Objects.hash(name, age);
}
```
这样,当我们把两个Person对象放入HashMap时,它们会被认为是相同的对象,因为它们的hashCode值相等。
举例什么时候需要重写hashcode
在Java中,当我们使用HashMap、HashSet或Hashtable等集合类时,需要重写hashCode方法。因为这些集合类内部使用了哈希表数据结构,而哈希表的实现依赖于hashCode方法的正确性。
如果两个对象相等,那么它们的hashCode值必须相同;反之,如果两个对象的hashCode值相同,它们并不一定相等。因此,我们在重写equals方法的同时也要重写hashCode方法,以保证对象的相等性和哈希码的一致性。
举个例子,如果我们定义了一个Person类,其中包含了name和age两个属性:
```java
public class Person {
private String name;
private int age;
// 构造函数、getter和setter方法等省略
}
```
如果我们想要将Person对象放入HashMap中,并根据name作为键值,那么我们需要重写hashCode方法:
```java
public class Person {
private String name;
private int age;
// 构造函数、getter和setter方法等省略
@Override
public int hashCode() {
return Objects.hashCode(name);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return Objects.equals(name, person.name);
}
}
```
这里使用了Objects.hashCode和Objects.equals方法,它们可以处理null值,而不会抛出NullPointerException异常。这样,当我们将多个Person对象放入HashMap中时,它们会根据name属性进行哈希,以实现快速的查找和获取。