`
hekuilove
  • 浏览: 159168 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

重写自定义类的equals方法和hashcode方法

阅读更多
从数据库里查出一条数据。
查询两次,分别是两个实体Bean。
例如:select * from user where id=1
查询两次(不用Hibernate的情况下)分别是两个User对象,
这时需要比较两个对象是否相等(其实是要比较里面的内容是否相等)
JVM在堆中分配了两块内存存储这两个对象
如果单纯的使用equals比较结果肯定为false
可以查看equals方法的源码会发现其实equals比较的也是内存地址
public boolean equals(Object obj) {
	return (this == obj);
    }

但是我们期望比较的是里面的值啊,也就是说我们期望的结果应该是true
对此,可以学String类一样重写Object类的equals()和hashcode()
给个重写User类的例子:
public class User {

    private Integer id;
    private String name;

    public Integer getId() {
	return id;
    }

    public void setId(Integer id) {
	this.id = id;
    }

    public String getName() {
	return name;
    }

    public void setName(String name) {
	this.name = name;
    }

    /**
     * 重写equals方法 <br>
     * obj为传入的与当前对象相比较的对象
     */
    @Override
    public boolean equals(Object obj) {
	/*
	 * 判断传入的对象是否是当前类类型 如果不是则直接返回false
	 */
	if (obj instanceof User) {
	    User u = (User) obj;
	    return this.id.intValue() == u.getId().intValue();
	}
	return false;
    }

    /**
     * 重写hashcode
     */
    @Override
    public int hashCode() {
	// 这里可以写一个用来比较的实体属性
	return this.id;
    }
}


写一个main函数试一试
 public static void main(String[] args) {
	User u1 = new User();
	u1.setId(1);
	User u2 = new User();
	u2.setId(1);
	System.out.println(u1.equals(u2)); //打印结果为true
    }



最后谈一下,为什么重写equals时也非得重写hashcode,如果去掉重写hashcode那段方法会发现打印结果也是为true。
我举例说明:在映射表或散列表中存储对象时,检查映射表中是否存在该对象的标准就是检查hashcode,同时散列表会根据对象的hashcode来确定该对象将要具体存储到哪个桶。。。。详情请咨询《数据结构》
1
0
分享到:
评论
6 楼 hekuilove 2012-10-25  
witcheryne 写道
hashCode 方法是给 HashMap/ HashSet 用的.

class 栏目 {
     Set<User> users = new HashSet();
}

没有重写 User的 hashCode(),  users 数据会不对.


P.S:
看到你的头像, 条件反射: "杀一下"

5 楼 niva 2012-10-25  
烦死了!!
4 楼 风云无浪 2012-10-25  
其实是用hashCode的时候必须重写equals,只用euqals的话,不用hashCode也无所谓。
hashCode是为了hash的时候查找,而查找后需要比较,就需要equals了
3 楼 kidding87 2012-10-25  
witcheryne 写道
hashCode 方法是给 HashMap/ HashSet 用的.

class 栏目 {
     Set<User> users = new HashSet();
}

没有重写 User的 hashCode(),  users 数据会不对.


P.S:
看到你的头像, 条件反射: "杀一下"


== 也会判断hashcode
2 楼 sweat89 2012-10-25  
witcheryne 写道
hashCode 方法是给 HashMap/ HashSet 用的.

class 栏目 {
     Set<User> users = new HashSet();
}

没有重写 User的 hashCode(),  users 数据会不对.


P.S:
看到你的头像, 条件反射: "杀一下"

天命~~~哈哈......
1 楼 witcheryne 2012-10-25  
hashCode 方法是给 HashMap/ HashSet 用的.

class 栏目 {
     Set<User> users = new HashSet();
}

没有重写 User的 hashCode(),  users 数据会不对.


P.S:
看到你的头像, 条件反射: "杀一下"

相关推荐

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

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

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

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

    在 TestEqualsHashCode.java 文件中,通常会包含一个示例,演示如何正确地重写 `equals()` 和 `hashCode()` 方法。这个文件可能包含一个自定义类,并展示如何根据类的属性定义这两个方法,以实现特定的比较逻辑。 ...

    Java equals 方法与hashcode 方法的深入解析.rar

    在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...

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

    当我们在自定义类中重写 `equals()` 方法时,通常也需要重写 `hashCode()` 方法,这是为了遵循一些重要的原则和保证数据结构如 `HashMap`、`HashSet` 的正确行为。 首先,`equals()` 方法用于比较两个对象是否相等...

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

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

    equals,hashcode,toString

    在这个类中,很可能已经重写了`equals()`, `hashCode()` 和 `toString()` 方法,以便更好地处理对象的比较、哈希存储和输出信息。 为了实现`DBObject`类的正确行为,开发者可能考虑了以下几点: 1. 在`equals()`...

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

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

    Java中的equals和hashCode方法详解1

    在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。...在自定义类中,应根据对象的属性和业务逻辑来重写这两个方法,以确保相等的对象具有相等的哈希码,反之亦然。

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

    【面试】中提到的几个关键知识点集中在对象比较、equals()和hashCode()方法的使用以及它们之间的关系上。这些概念在Java编程中至关重要,特别是在处理集合类和比较对象时。 1、**hashCode与equals两者之间的关系**...

    C# Equals 和 GetHashCode 方法重写

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

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

    在Java编程中,`equals()`和`hashCode()`方法是Object类中的两个重要方法。当我们创建自定义类并将其对象放入集合(如HashSet)时,往往需要重写这两个方法以确保集合能够正确地处理这些对象。IntelliJ IDEA,作为一...

    equals 和 hashCode两者效果分析详解.docx

    如果一个类重写了`equals()`却没有重写`hashCode()`,可能会导致违反JavaDoc的建议,即`equals()`和`hashCode()`必须保持一致。这意味着,如果两个对象`equals()`返回`true`,那么它们的`hashCode()`也必须相同。...

    java中重写equals和重写hashCode()

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

    hashcode()和equals()

    在自定义类中,往往需要根据类的具体逻辑重写 `equals()` 方法,以满足业务需求,比如比较两个对象的属性是否相等。 在开发中,遵循以下规则是非常重要的: 1. 如果 `equals()` 方法被重写,那么 `hashCode()` 也...

    Java中的equals()和hashCode()契约Ja

    - 测试`equals()`和`hashCode()`的正确性,可以使用JUnit的EqualsTester类或自定义测试用例。 总之,`equals()`和`hashCode()`是Java中不可或缺的方法,它们对于对象的比较和哈希表操作起着核心作用。理解并正确...

    Java equals 方法与hashcode 方法的深入解析

    总的来说,理解并正确使用 `equals()` 和 `hashCode()` 是Java编程中的关键技能,特别是在处理自定义类的比较和存储时。良好的实践可以帮助提高代码的可读性和性能,同时减少潜在的错误。在面试中,对这两个方法的...

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

    在这种情况下,我们需要在自定义类中正确地实现`hashCode()` 和 `equals()` 方法。对于2位字符集合,我们可以考虑以下策略: - **hashCode()**: 可以将两个字符的ASCII值进行某种组合,如异或操作,然后对一个较大...

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

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

    深入 HashCode 方法~

    ### 深入理解 HashCode 方法 #### 一、HashCode 的基本概念与作用 在 Java 编程语言中,`HashCode` 是一个非常重要且基础的概念。...对于自定义类来说,正确地重写 `hashCode()` 和 `equals()` 方法是非常必要的。

Global site tag (gtag.js) - Google Analytics