博客 java. 覆盖等于和Hashcode方法的重要性

覆盖等于和Hashcode方法的重要性

在Java中,一切都是一个对象。每个类从Class对象隐式扩展。 equals()和hashcode()是对象类的方法。这两种方法彼此配合。以下部分解释了为什么这些方法需要覆盖和不覆盖的影响。

覆盖 等于() method

Equals()方法用于比较两个对象并返回布尔值,这指示两个比较对象是否以有意义的方式相同。我们还可以使用==(平等)运算符进行比较两个对象,但仅当两个对象引用都引用相同对象时,此比较结果才是真实的。换句话说,==运算符将对象引用与对象的实际内容进行比较。 equals()方法提供了比较对象的有意义的方法。我们覆盖了等于()方法以查看对象本身是否相等。为了以有意义的方式覆盖equals()方法,对于我们实现的每个类,我们必须根据某些条件确定类的两个实例是否相等(也许我们可以使用类的属性)。

以下代码示例描述了如何覆盖equals()方法。


public class CarTest {
public static void main(String... args) {
Car firstCar = new Car("red");
Car secondCar = new Car("red");

if(Firstcar.equals(第二座)){
system.out.println(“第一辆车和第二辆车等于”);
} 别的 {
system.out.println(“第一辆车和第二辆车不平等”);
}
}
}

班车{

私有字符串颜色;

汽车(弦颜色){
this.color =颜色;
}

public string getColor(){
返回颜色;
}

公共布尔等于(对象O){
if((o instanceof car)&&((car)o).getcolor()== this.Color){
返回真;
} 别的 {
返回false;
}
}

}

输出
第一辆车和第二辆车等于

在上面的代码示例中,我们创建了两个具有相同颜色的汽车实例。颜色值被传递给汽车实例作为构造函数参数。然后我们相互比较并在输出消息中打印结果。

如果我们看到汽车类声明,尤其是覆盖等式()方法的部分,Equals()方法将对象作为参数,因此我们确保了实际对象是汽车的一个实例,然后我们确保了我们的类型将其转换为汽车。这是因为在我们通过汽车实例的主要方法中,我们知道我们可以肯定会在Qualls()方法中投用对象引用。然后我们正在比较汽车实例颜色值,如果颜色是相同的,我们决定返回true以指示两辆车是相同的。另一方面,如果颜色不同,我们决定返回FALSE,这意味着汽车实例不等于。

如果我们更改了第一辆汽车实例或第二辆汽车实例的颜色,我们会得到不同的输出,因为颜色不同,因此汽车不会相等。

如果我们在我们的类中没有覆盖equals()方法,我们就不能将我们的类实例用作哈希表或Hashmap中的键,并且我们不会获得准确的集合,因为没有重复。换句话说,我们没有指示识别Equals()方法中的重复项的方法。覆盖equals()方法始终是最佳实践。

覆盖 hashcode() method

HashCode()方法返回对象的整数哈希码值,以便可以在集合中使用该对象。像hashmap或hashset等集合使用对象的哈希码值来确定如何将对象存储在集合中(我们调用它桶),也使用相同的哈希码来定位对象。从逻辑上讲我们可以想到Hashcodes一种方法来存储/识别集合中的对象。

在将正确的对象识别出集合中时,会发生以下逻辑操作。

  1. 使用hashcode找到合适的桶()
  2. 使用Equals()搜索桶中的确切对象

该集合将使用哈希码值将元素分发到不同的存储桶中,因此每个逻辑桶可以包含多个元素。同样,Equals()方法用于从桶中检索正确的元素。

散列码主要用于增加大集合的性能。我们的散列算法越好,我们在存储或从集合中存储或检索元素时的更精细的性能。

以下代码示例显示了如何覆盖HashCode()方法。


class HashCode {

公共INT I;

哈希码(int i){
这个。我=我;
}

public int hashcode(){
返回i * 7;
}

}

如上所述所示,HashCode()方法可以包含散列或复杂算法逻辑的简单实现,返回对象的哈希码以进行性能增益。要将我们的类作为HashMap或Hashtable中的键,它总是更好地覆盖Equals()和HashCode()方法,以便我们的收藏率以最佳性能返回准确的结果。

关于Amit Verma.

Amit是一种巨大的技术作家。他总是以创新的思维和实用方法激发技术人员。一个关于每个技术问题的通往个性,毫无疑问,首席问题 - 解决者!
传播爱心

1条评论

  1. 覆盖是面向对象编程的核心概念以及Java编程语言。方法覆盖用于提供由其超级类提供的方法的具体实现。感谢分享。

发表评论

请输入您的评论!
请在这里输入您的姓名