`
chroya
  • 浏览: 661507 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

自定义对象需要重写hashcode

 
阅读更多

      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方法_equals_重写equals和hashcode方法_

    当我们创建自定义类并需要对对象进行精确比较时,通常需要重写这些方法。以下是对`equals()` 和 `hashCode()` 方法的详细解释及其重写的重要性。 **1. equals() 方法** `equals()` 方法用于比较两个对象是否相等。...

    重写hashCode()和equals()方法详细介绍

    总之,重写`equals()`和`hashCode()`是Java面向对象编程中常见的做法,特别是在创建自定义类并希望基于对象的属性而不是引用进行比较时。遵循上述原则和最佳实践,可以确保代码的正确性和效率。

    java中为何重写equals时必须重写hashCode方法详解

    例如,当你尝试将一个自定义对象放入 `HashSet` 或 `HashMap` 时,由于 `equals()` 和 `hashCode()` 的不一致,可能导致对象无法正常添加,或者在集合中出现重复项,这将违反这些集合类的预期行为。 举例说明,假设...

    why在重写equals时还必须重写hashcode方法分享

    然而,在实际应用中,我们往往需要根据对象的内容来判断它们是否相等,因此在自定义类中重写 `equals()` 方法是常见的做法。例如,`String` 类就重写了 `equals()`,比较两个字符串的字符序列是否相同。 接着,我们...

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

    总之,重写 `equals` 和 `hashCode` 方法是保证自定义对象在集合中正确比较和存储的关键。这样做不仅可以满足特定的业务需求,还能确保集合操作的正确性和效率。在实现类时,应始终注意这两个方法的配合使用,以遵循...

    【面试】hashCode与equals两者之间的关系 / == 和equals / 为什么要重写equals方法 / 重写equals /hashcode方法 / 为什么要重写hashCode方法

    6、**何时需要重写hashCode()方法?** 当重写了`equals()`方法时,通常也需要重写`hashCode()`。因为如果不这样做,当两个对象根据`equals()`相等但`hashCode()`不同时,将违反哈希表的性质,导致不期望的行为。 7...

    java中重写equals和重写hashCode()

    总结来说,当重写 `equals()` 方法以比较对象内容时,也需要重写 `hashCode()` 方法以保持对象平等性和哈希码的一致性。这样可以确保散列数据结构能够正确处理相等的对象,防止出现不应有的重复元素。对于 Java ...

    equals与hashCode在实际开发中的重写写法

    这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作,我们往往需要重写它们。以下是对这两个方法的详细解释以及在实际开发中的应用。 `equals()` 方法: `equals()`...

    深入 HashCode 方法~

    - 当我们自定义一个类时,通常需要重写 `hashCode()` 方法来提供更合理的 `HashCode` 值。 - 一个常见的实现方式是结合类中的关键属性来计算 `HashCode`,例如:`return Attribute1.hashCode() + Attribute2....

    如何在IDEA中对 hashCode()和 equals() 利用快捷键快速进行方法重写

    当我们创建自定义类并将其对象放入集合(如HashSet)时,往往需要重写这两个方法以确保集合能够正确地处理这些对象。IntelliJ IDEA,作为一款强大的Java集成开发环境,提供了便捷的快捷键功能来帮助开发者快速重写`...

    C# Equals 和 GetHashCode 方法重写

    这两个方法通常需要在自定义类中进行重写,以满足特定业务逻辑的需求。 #### 1. Equals 方法 `Equals` 方法用于比较两个对象是否相等。默认情况下,所有对象都继承自 `Object` 类,而 `Object` 类中的 `Equals` ...

    equals,hashcode,toString

    如果需要自定义对象的相等性比较,例如根据对象的属性来判断两个对象是否相等,那么就需要重写`equals()`方法。重写时应遵循一致性、对称性、传递性、反身性和非空性等原则,确保比较逻辑的正确性。 `hashCode()` ...

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    在自定义类中,为了使对象能被HashSet或HashMap正确处理,通常需要重写hashCode()和equals()方法,确保它们遵循一致性原则。 在ArrayList和HashSet的比较中,我们可以总结以下几点: 1. 数据结构:ArrayList基于...

    详解Java中用于查找对象哈希码值的hashCode()函数

    在Java编程语言中,`hashCode()`函数是一个非常关键的方法,特别是在使用哈希数据结构如HashMap、HashSet和Hashtable时。...在使用自定义对象作为键时,尤其需要注意这一点,以避免哈希碰撞和不期望的行为。

    Java中的equals和hashCode方法详解1

    然而,根据具体的应用场景,我们通常需要在自定义类中重写这些方法,以满足特定的需求。 `equals()`方法主要用于比较两个对象是否相等。默认情况下,`equals()`方法会比较两个对象的内存地址,也就是检查它们是否...

    超详细_解释java_equals()与hashCode().pdf

    总之,理解并正确实现`equals()`和`hashCode()`方法是Java编程中的基础技能,特别是在设计和使用自定义对象时,这关系到对象的正确比较和哈希表的高效操作。遵循Java的约定并确保这两个方法的一致性,可以确保代码的...

    5_hash5_hashcod

    `hashCode`方法是Object类的一个成员方法,当我们在自定义类中重写它时,目的是为对象生成一个唯一的整数值,这个值通常基于对象的内部状态。在哈希表中,对象的`hashCode`被用来快速定位对象存储的位置。如果两个...

    hashcode代码

    总结起来,`hashCode()` 和 `equals()` 方法在Java中是用于对象比较和哈希表操作的关键方法,自定义类应根据实际需求重写这两个方法。`Point` 类的示例展示了如何实现这些方法以及它们在实际代码中的应用。同时,...

    HashCode相同equals不同的2位字符集合算法

    默认情况下,`hashCode()` 返回对象的内存地址的某种表示,但通常我们需要重写这个方法,使得具有相同逻辑内容的对象返回相同的哈希码。 2. **equals()**:同样来自Object类,它用于比较两个对象是否相等。默认行为...

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

    然而,对于自定义类,通常我们需要重写`equals()`来根据类的业务逻辑来判断对象内容是否相等,例如比较两个Person对象的姓名和年龄是否相同。 `hashCode()`方法则与`equals()`密切相关,它返回一个整数值,代表对象...

Global site tag (gtag.js) - Google Analytics