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
分享到:
相关推荐
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
- 为了避免哈希冲突带来的性能问题,在覆盖`equals()`方法的同时,通常也需要覆盖`hashCode()`方法。 #### 实现示例 以下是一个简单的类`Person`,展示了如何正确覆盖`equals()`和`hashCode()`方法: ```java ...
首先,根据键的 `hashCode` 定位到对应的桶,然后遍历桶中的条目,如果找到一个条目的键与要插入的键 `equals` 并且哈希值相同,那么就会覆盖旧的值,否则会在桶中添加新的条目。如果两个键的 `equals` 返回 true 但...
假设我们有一个自定义类`Person`,我们需要为其实现`hashCode`和`equals`方法: ```java public class Person { private String name; private int age; // 构造函数和其他方法省略... @Override public ...
这就是为什么在重写 `equals()` 时,通常也需要重写 `hashCode()`。 来看看 `String` 的 `hashCode()` 源码: ```java public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] =...
如果没有重写`hashCode()`,当一个`PhoneNumber`对象作为键放入`HashMap`时,即使`equals()`方法返回`true`表示两个电话号码相等,由于它们的`hashCode()`可能不同,`HashMap`可能会将它们视为不同的键,导致预期的...
为什么需要重写 equals 和 hashCode 方法? 在 Object 类中,equals 方法的原始实现是: public boolean equals(Object obj) { return (this == obj); } 这个方法是比较两个对象的内存地址,而不是逻辑内容。...
反之,`hashCode()` 相同的两个对象并不意味着 `equals()` 一定为 true,因为不同的对象可能产生相同的哈希码,这称为哈希碰撞。 当你创建一个新的类并打算将其实例存储在集合(如 `Set`)中时,应该同时重写 `...
为什么需要覆盖`equals()`方法? 默认情况下,`equals()`方法只比较两个对象的内存地址是否相同,这通常不是我们期望的行为。例如,在处理字符串、数字等对象时,我们更关心的是它们的值是否相同,而不是它们是否...
1. **实现`equals`必须同时实现`hashCode`**:如果你覆盖了`equals`方法,那么你也必须覆盖`hashCode`方法,以保证一致性。 2. **避免返回固定值**:不要在`hashCode`方法中总是返回一个固定的值,比如0,这会导致...
在Java编程语言中,序列化(Serialization)和重写`hashCode`及`equals`方法是两个重要的概念,它们各自有着特定的用途,并且在某些情况下相互关联。下面将详细阐述这两个概念及其应用。 首先,Java序列化是将一个...
- 如果两个对象通过`equals()`方法判断为相等,那么它们的`hashCode()`值必须相等。这保证了哈希表中相等的对象可以被正确地识别和处理。 **2. `equals()`与`hashCode()`的关系** - 根据Java规范,如果两个对象的`...
因此,为了使`equals()`方法能根据对象的属性值进行比较,我们需要在子类中覆盖`equals()`方法。以下是如何在`Cat`类中重写`equals()`的示例: ```java @Override public boolean equals(Object obj) { if (this =...
jv-equals-hashcode 给定的类—矩形。 覆盖它的方法equals()和hashCode()所以equals()通过其字段(颜色,宽度和长度equals()比较Rectangle对象。 还要确保hashCode()遵循equals和hashcode之间的约定。
5. **覆盖`hashCode()`**:如果两个对象根据`equals()`方法比较相等,它们的`hashCode()`方法必须返回相同的值。反之不成立,因为不同的对象可能有相同的`hashCode()`。 遵循这些准则,我们可以编写符合预期的`...
Object 类常用方法有 getClass()、hashCode()、toString()、equals()、finalize() 等。 getClass() 方法 getClass() 方法用于获取对象的实际类型。该方法返回了 Object 的 Class 对象,表示该对象的实际类型。应用...
- **为什么同时覆盖equals和hashCode?** - 当两个对象根据equals方法比较相等时,它们的hashCode值也必须相同,这是为了确保基于哈希的集合能够正确地工作。 - **hashCode的作用**: - 主要是为了配合基于散列的...