错误案例
【现象描述】 里面判断容器应该要包含的对象,实际上却没有
【错误代码】
class T {
private String str;
T(String str) {
this.str = str;
}
public boolean equals(Object obj) {
if(!(obj instanceof T)){
return false;
}
T t = (T)obj;
return t.equals(this.str);
}
//这里没有覆写hashCode方法
public static void main(String[] args) {
Set set = new HashSet();
set.add(new T("str"));
System.out.println(set.contains(new T("str")));//false
}
}
错误分析
HashMap和HashSet获取value是通过传入的object的hashcode在内存中找地址,如果存在对应的value,就把地址对应的value返回。
contains是通过传入的object的hashcode在内存中找地址,将传入的object和对应地址上的value通过equals方法比较,如果相等就返回true,否则false。
如果new一个object作为key去拿value是永远得不到结果的,因为每次new一个object,这个object的hashcode是永远不同的,所以我们要重写hashcode。
所以,在这个例子中在覆写equals这个方法的同时,还要覆写hashCode方法。
正确用法
class T {
private String str;
T(String str) {
this.str = str;
}
public boolean equals(Object obj) {
if(!(obj instanceof T)){
return false;
}
T t = (T)obj;
return t.equals(this.str);
}
//同时要覆写hashCode方法
public int hashCode() {
int hash = 0;
if(str!=null){
for(char c: str.toCharArray()){
hash +=c;
}
}
return hash;
}
}
分享到:
相关推荐
"Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object...同时,我们还需要注意到,重写equals方法时,必须重写hashCode方法,以便于确保对象的正确性和一致性。
* 覆写 hashcode 方法,需要把某个非零常数值,例如 17,保存在 int 变量 result 中。 * 对于对象中每一个关键域 f(指 equals 方法中考虑的每一个域): + 对于 boolean 型,计算(f? 0 : 1)。 + 对于 byte,char,...
- 覆写equals方法时要处理null值,同时覆写hashcode以保持一致性。 - 推荐覆写toString方法,提供更友好的输出。 - 使用package-info.java为包提供元数据。 4. **字符串操作**: - 使用字符串直接量赋值,提高...
当覆写对象的equals()方法时必须同时覆写hashCode()方法。equals和hashCode方法是对象在hash容器内高效工作的基础,正确的覆写这两个方法才能保证在hash容器内查找对象的正确性。 遵循这些军规可以确保Java开发的...
2. **覆写 hashCode 方法**:为了确保相等的对象有相同的哈希码,你需要在重写 `equals` 方法的同时,也重写 `hashCode` 方法。可以参考包装类(Wrapper Classes)中的实现。 **对象的复制** 1. **Object 类的 ...
#### 军规八:覆写equals()方法时同时覆写hashCode() - **解释**:当一个对象的equals()方法被覆写后,如果没有同时覆写hashCode()方法,可能会导致该对象在哈希表中的行为不符合预期。 - **实践建议**:确保equals...
2. **覆写hashCode**:确保相等的对象有相同的哈希码,不相等的对象有不同哈希码,以保证集合类的行为正确。 3. **始终覆写toString**:提供对象状态的简洁表示,有助于调试和日志记录。 4. **小心覆写clone**:`...
覆写`equals`方法是为了比较两个对象是否相等,通常在重写`equals`时,也需要考虑覆写`hashCode`方法以保持一致性。 总的来说,本篇笔记涵盖了Java面向对象编程的基础知识,包括类和对象的定义、方法的创建、对象的...
军规八:覆写对象的 equals() 方法时必须同时覆写 hashCode() 方法。这是因为当对象被添加到集合中时,需要使用 hashCode() 方法来判断对象的唯一性。 军规九:禁止循环中创建新线程,尽量使用线程池。这是因为循环...
Collection接口提供了一系列通用方法,如contains()(判断是否包含指定元素)、clear()(清空容器)、equals()(比较两个集合是否相等)和iterator()(获取迭代器)。 1.2.2 迭代器 迭代器是遍历集合中元素的主要...
当重写`equals`方法时,务必同时重写`hashCode`方法,以保持对象一致性,这对于集合框架尤其重要。 **2.2.6 懒加载对象** 懒加载对象时,不推荐使用双检查锁定(Double-Checked Locking)模式,因为这可能在多线程...
为了保证元素的唯一性,存储在HashSet中的对象必须正确地覆写hashCode和equals方法。TreeSet利用二叉树的原理对元素进行排序,它可以将元素按照指定的顺序进行排序。如果需要对自定义对象进行排序,则要求该对象必须...
Lombok是一款java库,主要用来简化java代码的编写,通过使用注解,可以减少大量的getter、setter、equals、hashCode、toString等方法的编写,从而提高开发效率。 安装Lombok 要使用Lombok,需要先安装Lombok插件。...
Java八股文主要涵盖Java语言的基础知识,包括对象方法、数据类型、序列化、字符串处理、方法重载与重写、反射、动态代理以及集合框架等核心概念。下面将逐一详细解析这些知识点。 1. **Object类相关方法** - `...
- **equals** 方法用于比较两个对象的内容是否相等。默认情况下,equals 方法的行为类似于 "==",但可以被覆写以实现更复杂的比较逻辑。 - **示例代码**: ```java Integer a = new Integer(10); Integer b = new ...
如果想要自定义元素的相等性,可以在覆盖equals()方法的同时,也覆盖hashCode()方法以保持一致性。 以上是对标题和描述中提到的知识点的详细说明。这些知识点涵盖了Java编程语言的基础概念和技术细节,对于初学者和...
为了优化Map的性能,对象在作为键使用时,通常需要覆写hashCode()和equals()方法,确保当两个键被视为相等时,它们的哈希码也相同。 总结,Java集合框架为开发者提供了灵活的数据组织方式,无论是在简单的数据管理...
为了保证Map的正确工作,键对象必须实现equals()和hashCode()方法,使得相等的键返回相同的哈希码,这样在Map中查找时能正确找到对应的键值对。 总结来说,Java集合框架提供了丰富的数据结构和算法,帮助开发者高效...