`

为什么覆盖了equals方法一定要覆盖hashcode方法?

    博客分类:
  • java
 
阅读更多
1 测试代码
public class HashMapTest {
public static class CC {
private String cc;
public String getCc() {
return cc;
}
public void setCc(String cc) {
this.cc = cc;
}
public CC(String cc) {
this.cc = cc;
}
@Override
public boolean equals(Object arg0) {
CC testC = (CC) arg0;
return cc.equals(testC.getCc());
}
}
public static void main(String[] args) {
Map<CC,String> map = new HashMap<CC,String>();
map.put(new CC("aa"), "bb");
System.out.println(map.get(new CC("aa")));
}
} 


因为覆盖了equals方法因此希望得到的结果应该是"bb",但是因为没有覆盖hashcode方法,所以实际得到的是null
因为两个new CC("aa")的hashcode的值不同,所以实际上在hashmap
中是找不到值得。

解决办法 复写hashcode方法
public class HashMapTest {
public static class CC {
private String cc;
public String getCc() {
return cc;
}
public void setCc(String cc) {
this.cc = cc;
}
public CC(String cc) {
this.cc = cc;
}
@Override
public boolean equals(Object arg0) {
CC testC = (CC) arg0;
return cc.equals(testC.getCc());
}
@Override
public int hashCode() {
return cc.hashCode();
}
}
public static void main(String[] args) {
Map<CC,String> map = new HashMap<CC,String>();
map.put(new CC("aa"), "bb");
System.out.println(map.get(new CC("aa")));
}
} 


就可以正确获得结果
bb
分享到:
评论

相关推荐

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    java中hashcode()和equals()方法详解

    - 为了避免哈希冲突带来的性能问题,在覆盖`equals()`方法的同时,通常也需要覆盖`hashCode()`方法。 #### 实现示例 以下是一个简单的类`Person`,展示了如何正确覆盖`equals()`和`hashCode()`方法: ```java ...

    为什么在重写 equals方法的同时必须重写 hashcode方法

    首先,根据键的 `hashCode` 定位到对应的桶,然后遍历桶中的条目,如果找到一个条目的键与要插入的键 `equals` 并且哈希值相同,那么就会覆盖旧的值,否则会在桶中添加新的条目。如果两个键的 `equals` 返回 true 但...

    set接口经常用的hashCode和equals方法详解

    假设我们有一个自定义类`Person`,我们需要为其实现`hashCode`和`equals`方法: ```java public class Person { private String name; private int age; // 构造函数和其他方法省略... @Override public ...

    面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗?

    这就是为什么在重写 `equals()` 时,通常也需要重写 `hashCode()`。 来看看 `String` 的 `hashCode()` 源码: ```java public int hashCode() { int h = hash; if (h == 0 && value.length &gt; 0) { char val[] =...

    Java 覆盖equals时总要覆盖hashcode

    如果没有重写`hashCode()`,当一个`PhoneNumber`对象作为键放入`HashMap`时,即使`equals()`方法返回`true`表示两个电话号码相等,由于它们的`hashCode()`可能不同,`HashMap`可能会将它们视为不同的键,导致预期的...

    学习Object类——为什么要重写equeals和hashcode方法

    为什么需要重写 equals 和 hashCode 方法? 在 Object 类中,equals 方法的原始实现是: public boolean equals(Object obj) { return (this == obj); } 这个方法是比较两个对象的内存地址,而不是逻辑内容。...

    java中hashCode方法与equals方法的用法总结

    反之,`hashCode()` 相同的两个对象并不意味着 `equals()` 一定为 true,因为不同的对象可能产生相同的哈希码,这称为哈希碰撞。 当你创建一个新的类并打算将其实例存储在集合(如 `Set`)中时,应该同时重写 `...

    java中hashcode()和equals()的详解.docx

    为什么需要覆盖`equals()`方法? 默认情况下,`equals()`方法只比较两个对象的内存地址是否相同,这通常不是我们期望的行为。例如,在处理字符串、数字等对象时,我们更关心的是它们的值是否相同,而不是它们是否...

    hashcode与eqault比较

    1. **实现`equals`必须同时实现`hashCode`**:如果你覆盖了`equals`方法,那么你也必须覆盖`hashCode`方法,以保证一致性。 2. **避免返回固定值**:不要在`hashCode`方法中总是返回一个固定的值,比如0,这会导致...

    java 序列化和重写 hashCode 的原因

    在Java编程语言中,序列化(Serialization)和重写`hashCode`及`equals`方法是两个重要的概念,它们各自有着特定的用途,并且在某些情况下相互关联。下面将详细阐述这两个概念及其应用。 首先,Java序列化是将一个...

    如何正确实现Java中的HashCode共6页.pdf.z

    - 如果两个对象通过`equals()`方法判断为相等,那么它们的`hashCode()`值必须相等。这保证了哈希表中相等的对象可以被正确地识别和处理。 **2. `equals()`与`hashCode()`的关系** - 根据Java规范,如果两个对象的`...

    Java编程中的equals方法使用全解

    因此,为了使`equals()`方法能根据对象的属性值进行比较,我们需要在子类中覆盖`equals()`方法。以下是如何在`Cat`类中重写`equals()`的示例: ```java @Override public boolean equals(Object obj) { if (this =...

    jv-equals-hashcode

    jv-equals-hashcode 给定的类—矩形。 覆盖它的方法equals()和hashCode()所以equals()通过其字段(颜色,宽度和长度equals()比较Rectangle对象。 还要确保hashCode()遵循equals和hashcode之间的约定。

    关于equals()方法,jdk源码给出如下五点建议

    5. **覆盖`hashCode()`**:如果两个对象根据`equals()`方法比较相等,它们的`hashCode()`方法必须返回相同的值。反之不成立,因为不同的对象可能有相同的`hashCode()`。 遵循这些准则,我们可以编写符合预期的`...

    Object类常用方法(csdn)————程序.pdf

    Object 类常用方法有 getClass()、hashCode()、toString()、equals()、finalize() 等。 getClass() 方法 getClass() 方法用于获取对象的实际类型。该方法返回了 Object 的 Class 对象,表示该对象的实际类型。应用...

    java面试重点总结

    - **为什么同时覆盖equals和hashCode?** - 当两个对象根据equals方法比较相等时,它们的hashCode值也必须相同,这是为了确保基于哈希的集合能够正确地工作。 - **hashCode的作用**: - 主要是为了配合基于散列的...

Global site tag (gtag.js) - Google Analytics