`
aiou
  • 浏览: 194922 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

zz为什么要重写equals和hashCode方法

 
阅读更多
http://blog.csdn.net/zh_w_h163/article/details/11907869

在程序中,我们习惯使用equals方法来比较两个对象,继承自Object的equals方法默认的比较两个对象的内存地址(String类重写了equals方法,比较字符串的内容)。假如我们创建了两个Person对象,二者同名同姓,我们认为二者相同,但若是用equals方法比较二者,由于内存地址不同,返回的仍是false。因此我们需要重写equlas方法,以我们的视角来建立规则。我们以实例来分析:

我们创建一个类并重写其equals方法,并创建两个对象person1和person2对象,然后比较二者。
1.重写equals方法

[java] view plaincopyprint?

    public class Person { 
        private String name; 
        private int age; 
        @Override 
        public boolean equals(Object obj) { 
            // TODO Auto-generated method stub 
            if (this == obj) {// 如果二者引用的为同一个对象,则返回true 
                return true; 
            } 
            if (obj == null) {// 如果比较的对象为null,返回false 
                return false; 
            } 
            if (obj.getClass() != this.getClass()) { 
                return false;//如果二者不是同一类对象,则返回false 
            } 
            Person person=(Person)obj; 
            if(person.getName().equals(getName())&&person.getAge()==getAge()){ 
                return true; 
            } 
            return false; 
        } 
     
        public void setAge(int age) { 
            this.age = age; 
        } 
     
        public int getAge() { 
            return age; 
        } 
        public String getName() { 
            return name; 
        } 
        public void setName(String name) { 
            this.name = name; 
        } 
    } 

通过Junit测试,并将两个对象存放到HashSet之中,代码如下:

[java] view plaincopyprint?

    public class TestDemo { 
        Set<Person> set=new HashSet<Person>();//定义一个HashSet存放person对象 
        @Test 
        public void test1(){ 
            Person person1=new Person(); 
            person1.setName("zhang"); 
            person1.setAge(18); 
            Person person2=new Person(); 
            person2.setName("zhang"); 
            person2.setAge(18); 
            System.out.println("返回结果:"+person1.equals(person2)); 
            set.add(person1); 
            set.add(person2); 
            System.out.println("set存在"+set.size()+"个对象\n"+set); 
        } 
    } 

结果如下所示:
二者比较结果:true
set存在2个对象:[com.zhang.demo.Person@1ceebfa, com.zhang.demo.Person@1e6743e]

此时我们发现一个问题,虽然通过重写equals方法判断两个对象相等,但二者都存入到了set之中。纳尼?众所周知,set中只能存入不同的对象,显然对于HashSet来说,仅仅重写equals方法是不够的(对于HashMap也一样),通过了解集合比较对象的原理,我们才知道,原来集合先比较两个对象的HashCode是否相等,若相等,则通过equlas方法比较,若两个方法都通过,则两个对象被视为同一个对象。接下来,我们再将hashCode方法重写。
2.重写hashCode方法
[java] view plaincopyprint?

    public int hashCode() { 
            // TODO Auto-generated method stub 
            int prime = 31;// 只要为素数就可以 
            int result = 1; 
            result=result*prime+(name==null?0:name.hashCode()); 
            result=result*prime+age; 
            return result; 
        } 


然后在通过以上的测试方法测试,结果如下:
二者比较结果:true
set存在1个对象:[com.zhang.demo.Person@d6168d67]

此时,HashSet之中只存入了一个对象。


不重写的话,equals是使用父类的。
而默认的object的equals,只是地址对比而已。
所以很可能和需求不一样。

因此,如果自己写的话,又要用到equals,一般都会重写。

用不到就不用重写了,但不能保证用不到

嗯,用不到就无所谓了。

和toString()情况差不多吧

不以自己实现的对象作为key存入哈希表或者hashset,也不用重写hashCode方法(个人认为)

tostring不重写不会引起大错误吧,equals好像不重写用了会有大问题
分享到:
评论

相关推荐

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

    以下是对`equals()` 和 `hashCode()` 方法的详细解释及其重写的重要性。 **1. equals() 方法** `equals()` 方法用于比较两个对象是否相等。默认情况下,`equals()` 检查两个对象是否是同一个对象(即内存地址是否...

    关于重写equals,hashcode以及compareTo方法!

    重写equals()、hashcode()和compareTo()方法是非常重要的,它可以使我们的程序更加高效、可靠和灵活。在实际开发中,我们需要根据具体情况来决定是否需要重写这些方法,并遵守相关的规则,以避免出现意想不到的结果...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    学习Object类——为什么要重写equeals和hashcode方法

    为什么需要重写 equals 和 hashCode 方法? 在 Object 类中,equals 方法的原始实现是: public boolean equals(Object obj) { return (this == obj); } 这个方法是比较两个对象的内存地址,而不是逻辑内容。...

    Java重写equals及hashcode方法流程解析

    在实际开发中,我们经常需要重写equals和hashCode方法,以便于正确地比较和存储对象。下面是一个简单的示例代码: public class Student { private String name; private int age; private String QQ; @...

    为什么重写equals方法,还必须要重写hashcode方法

    为什么重写equals方法,还必须要重写hashcode方法

    Java_重写equals()和hashCode()

    这就是为什么在设计类时,重写这两个方法是至关重要的,尤其是在实现集合类的元素或键值对时。 总之,理解并正确重写 `equals()` 和 `hashCode()` 方法对于编写高质量的Java代码至关重要,这直接影响到对象比较的...

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

    3、**为什么要重写equals()方法?** 默认情况下,`equals()`方法继承自`Object`类,比较的是对象的引用。在处理自定义类时,我们可能关心的是对象的属性是否相等,而不是它们的内存地址。因此,为了基于对象的内容...

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

    在重写 `hashCode()` 时,要确保它和 `equals()` 方法保持一致。一种常见做法是将对象的各个属性值进行位运算(如异或、加法等),并结合对象的类的哈希码,以生成一个独特的整数。 关联 `equals()` 和 `hashCode()...

    重写equals方法

    第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...

    equals与hashCode方法讲解

    equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...

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

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

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    Java 中重写 equals() 方法的同时要重写 hashCode() 方法的重要性 在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否...

    关于Object中equals方法和hashCode方法判断的分析

    下面是一个简单的示例代码,演示了如何重写 equals 和 hashCode 方法: ```java public class Person { @Override public boolean equals(Object obj) { System.out.println("判断 Person 的 equals"); return ...

    重写toString和equals方法

    为什么要重写 equals() 方法 在 Object 类中,equals() 方法默认比较的是对象的引用是否指向同一块内存地址。这意味着,如果我们不重写 equals() 方法,那么比较两个对象是否相等将是基于对象的引用地址,而不是...

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

    如果我们重写了`equals()`方法来基于`name`和`age`判断两个`Coder`对象是否相等,那么我们也应该重写`hashCode()`,使具有相同`name`和`age`的`Coder`对象产生相同的哈希码。通常,`hashCode()`的实现会结合所有参与...

    Java理论与实践:hashCode()和equals()方法

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    Java中的equals和hashCode方法详解1

    在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...

    equals,hashcode,toString

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

Global site tag (gtag.js) - Google Analytics