Java中的很多对象都override了equals方法,都知道,这是为了能比较两个对象是否相等而定义,如果不需要比较,则不需要定义equals方法。比如StringBuffer类,没有提供equals方法,则说明没有两个StringBuffer对象是相等的。再比如Collections类,全部是静态方法,根本没必要创建对象,所以也就没有提供equals方法。
我们程序中自定义的对象有时候需要比较它们是否相等,也需要重写equals方法。如果我们要将对象放到HashMap或者Hashtable这样的hash集合中的时候,就需要重写hashcode方法了。因为它们是根据hashcode来标识对象的。
如果我们不重写hashcode方法,把他们作为key放入hashmap中是什么情况呢?看看下面代码:
import java.util.HashMap;
public class HashTest {
public static void main(String...args) {
MyBean a = new MyBean();
a.x = 1;
a.s = "xyz";
MyBean b = new MyBean();
b.x = 1;
b.s = "xyz";
HashMap<MyBean, String> map = new HashMap<MyBean, String>();
map.put(a, "a");
map.put(b, "b");
System.out.println("a equals b:"+a.equals(b));
System.out.println("map size:"+map.size());
System.out.println("a:"+map.get(a));
System.out.println("b:"+map.get(b));
}
}
class MyBean {
int x;
String s;
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(!(obj instanceof MyBean)) return false;
if(((MyBean)obj).x == x) return true;
return false;
}
}
结果如下:
a equals b:true
map size:2
a:a
b:b
a和b明明是相等的,可是放进hashmap中之后,却被认为是两个对象,很诡异哦。
下面加上hashcode,再看看什么结果:
class MyBean {
int x;
String s;
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(!(obj instanceof MyBean)) return false;
if(((MyBean)obj).x == x) return true;
return false;
}
@Override
public int hashCode() {
return (s!=null?s.hashCode():1)*31+x;
}
}
结果如下:
a equals b:true
map size:1
a:b
b:b
这样才保证了相等的对象在hash集合中也相等。计算hashcode的时候,一般使用关键的属性的hashcode值。计算hashcode的属性较多则计算复杂,降低了效率,若较少的属性计算,则重复的hashcode较多,同样降低性能,写一个好的hashcode方法,还比较难。
所以,我们重写equals的时候,一定要重写hashcode方法。
分享到:
相关推荐
当我们创建自定义类并需要对对象进行精确比较时,通常需要重写这些方法。以下是对`equals()` 和 `hashCode()` 方法的详细解释及其重写的重要性。 **1. equals() 方法** `equals()` 方法用于比较两个对象是否相等。...
总之,重写`equals()`和`hashCode()`是Java面向对象编程中常见的做法,特别是在创建自定义类并希望基于对象的属性而不是引用进行比较时。遵循上述原则和最佳实践,可以确保代码的正确性和效率。
例如,当你尝试将一个自定义对象放入 `HashSet` 或 `HashMap` 时,由于 `equals()` 和 `hashCode()` 的不一致,可能导致对象无法正常添加,或者在集合中出现重复项,这将违反这些集合类的预期行为。 举例说明,假设...
然而,在实际应用中,我们往往需要根据对象的内容来判断它们是否相等,因此在自定义类中重写 `equals()` 方法是常见的做法。例如,`String` 类就重写了 `equals()`,比较两个字符串的字符序列是否相同。 接着,我们...
总之,重写 `equals` 和 `hashCode` 方法是保证自定义对象在集合中正确比较和存储的关键。这样做不仅可以满足特定的业务需求,还能确保集合操作的正确性和效率。在实现类时,应始终注意这两个方法的配合使用,以遵循...
6、**何时需要重写hashCode()方法?** 当重写了`equals()`方法时,通常也需要重写`hashCode()`。因为如果不这样做,当两个对象根据`equals()`相等但`hashCode()`不同时,将违反哈希表的性质,导致不期望的行为。 7...
总结来说,当重写 `equals()` 方法以比较对象内容时,也需要重写 `hashCode()` 方法以保持对象平等性和哈希码的一致性。这样可以确保散列数据结构能够正确处理相等的对象,防止出现不应有的重复元素。对于 Java ...
这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作,我们往往需要重写它们。以下是对这两个方法的详细解释以及在实际开发中的应用。 `equals()` 方法: `equals()`...
- 当我们自定义一个类时,通常需要重写 `hashCode()` 方法来提供更合理的 `HashCode` 值。 - 一个常见的实现方式是结合类中的关键属性来计算 `HashCode`,例如:`return Attribute1.hashCode() + Attribute2....
当我们创建自定义类并将其对象放入集合(如HashSet)时,往往需要重写这两个方法以确保集合能够正确地处理这些对象。IntelliJ IDEA,作为一款强大的Java集成开发环境,提供了便捷的快捷键功能来帮助开发者快速重写`...
这两个方法通常需要在自定义类中进行重写,以满足特定业务逻辑的需求。 #### 1. Equals 方法 `Equals` 方法用于比较两个对象是否相等。默认情况下,所有对象都继承自 `Object` 类,而 `Object` 类中的 `Equals` ...
如果需要自定义对象的相等性比较,例如根据对象的属性来判断两个对象是否相等,那么就需要重写`equals()`方法。重写时应遵循一致性、对称性、传递性、反身性和非空性等原则,确保比较逻辑的正确性。 `hashCode()` ...
在自定义类中,为了使对象能被HashSet或HashMap正确处理,通常需要重写hashCode()和equals()方法,确保它们遵循一致性原则。 在ArrayList和HashSet的比较中,我们可以总结以下几点: 1. 数据结构:ArrayList基于...
在Java编程语言中,`hashCode()`函数是一个非常关键的方法,特别是在使用哈希数据结构如HashMap、HashSet和Hashtable时。...在使用自定义对象作为键时,尤其需要注意这一点,以避免哈希碰撞和不期望的行为。
然而,根据具体的应用场景,我们通常需要在自定义类中重写这些方法,以满足特定的需求。 `equals()`方法主要用于比较两个对象是否相等。默认情况下,`equals()`方法会比较两个对象的内存地址,也就是检查它们是否...
总之,理解并正确实现`equals()`和`hashCode()`方法是Java编程中的基础技能,特别是在设计和使用自定义对象时,这关系到对象的正确比较和哈希表的高效操作。遵循Java的约定并确保这两个方法的一致性,可以确保代码的...
`hashCode`方法是Object类的一个成员方法,当我们在自定义类中重写它时,目的是为对象生成一个唯一的整数值,这个值通常基于对象的内部状态。在哈希表中,对象的`hashCode`被用来快速定位对象存储的位置。如果两个...
总结起来,`hashCode()` 和 `equals()` 方法在Java中是用于对象比较和哈希表操作的关键方法,自定义类应根据实际需求重写这两个方法。`Point` 类的示例展示了如何实现这些方法以及它们在实际代码中的应用。同时,...
默认情况下,`hashCode()` 返回对象的内存地址的某种表示,但通常我们需要重写这个方法,使得具有相同逻辑内容的对象返回相同的哈希码。 2. **equals()**:同样来自Object类,它用于比较两个对象是否相等。默认行为...
然而,对于自定义类,通常我们需要重写`equals()`来根据类的业务逻辑来判断对象内容是否相等,例如比较两个Person对象的姓名和年龄是否相同。 `hashCode()`方法则与`equals()`密切相关,它返回一个整数值,代表对象...