关闭

JAVA中重写equals()方法的同时要重写hashcode()方法

标签: hashcodeequal方法重写equal和hashcode方法
1419人阅读 评论(0) 收藏 举报
分类:
object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下:
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true 
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象
(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址
hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,
当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,

导致混淆,因此,就也需要重写hashcode()

import java.util.*;

public class HelloWorld {
    public static void main(String[] args) {
        /*
        Collection c = new HashSet();
        c.add("hello");
        c.add(new Name("f1","l1"));
        c.add(new Integer(100));
        c.remove("hello"); 
        c.remove(new Integer(100));
        System.out.println(c.remove(new Name("f1","l1")));
        */
        Name n1 = new Name("01");
        Name n2 = new Name("01");
        
        Collection c = new HashSet();
        c.add(n1);
        System.out.println("------------");
        c.add(n2);
        System.out.println("------------");
        System.out.println(n1.equals(n2));
        System.out.println("------------");
        System.out.println(n1.hashCode());
        System.out.println(n2.hashCode());
        System.out.println(c);
    }


}

class Name {
    private String id;
    public Name(String id) {
        this.id = id; 
    }
    
    public String toString(){
        return this.id;
    }
    public boolean equals(Object obj) {
        if (obj instanceof Name) {
            Name name = (Name) obj;
            System.out.println("equal"+ name.id);
            return (id.equals(name.id));
        }
        return super.equals(obj);
    }
        
    public int hashCode() {
        Name name = (Name) this;
        System.out.println("Hash" + name.id);
        return id.hashCode();
            
    }
}
复制代码

 

 
就这个程序进行分析,在第一次添加时,调用了hashcode()方法,将hashcode存入对象中,第二次也一样,然后对hashcode进行比较。hashcode也只用于HashSet/HashMap/Hashtable类存储数据,所以会用于比较,需要重写
总结,自定义类要重写equals方法来进行等值比较,自定义类要重写compareTo方法来进行不同对象大小的比较,重写hashcode方法为了将数据存入HashSet/HashMap/Hashtable类时进行比较

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

如何重写hashCode()和equals()方法

hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equals()方法最安全 如果你决定要重写equals()方法,那么你一定要明确这么做所带来的风险,并确...
  • tracker_w
  • tracker_w
  • 2013-12-02 12:57
  • 19199

如何正确的重写equals() 和 hashCode()方法

equals和hashCode重写技巧
  • zzg1229059735
  • zzg1229059735
  • 2016-05-25 15:36
  • 6504

详解重写equals()方法就必须重写hashCode()方法的原因

重写的作用: 如果重写(用于需求,比如建立一个Person类,比较相等我只比较其属性身份证相等就可不管其他属性,这时候重写)equals,就得重写hashCode,和其对象相等保持一致。如果不重写,那么一定保持一致。 1. 重写equals()方法就必须重写hash...
  • u013679744
  • u013679744
  • 2017-02-25 10:04
  • 2845

为什么重写equals方法,一定要重写HashCode方法?(

主要原因是默认从Object继承来的hashCode是基于对象的ID实现的。 如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。 这样,当你用其中的一个作为键保存到hashMap、hasoTa...
  • agfagafsdfas
  • agfagafsdfas
  • 2014-04-13 20:14
  • 598

为什么要重写hashcode和equals方法?

为什么要重写hashcode和equals方法? 相信很多小伙伴被这个问题给困扰很久了,下面我就给大家详细说一下我的理解吧~ 因为默认的hequals方法是Object的方法,比较的是内存地址;而默认的hashcode方法返回的是对象的内存地址转换成的一个整数,实际上指的的也是内存,两个...
  • world6
  • world6
  • 2016-08-05 11:42
  • 1411

重写equals时还必须重写hashcode方法,详解

http://www.cnblogs.com/happyPawpaw/p/3744971.html http://www.jb51.net/article/42408.htm http://blog.chinaunix.net/uid-26602509-id-3355659.html ...
  • basycia
  • basycia
  • 2016-07-31 22:03
  • 4196

重写hashCode与equals方法的作用

为了阐明其作用,我们先来假设有如下一个Person类。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
  • zhangweiiou
  • zhangweiiou
  • 2015-10-07 09:13
  • 2170

对于自定义类,重写equals方法和hashCode方法的技巧

参考:http://blog.csdn.net/fenglibing/article/details/8905007 对于自定义的类,如果要比较两个对象是否相同,就需要重写equals方法。举一个例子进行说明: 先自定义一个类,包含两个属性:class Person{ private Stri...
  • Genius_zz
  • Genius_zz
  • 2016-09-16 21:15
  • 4304

浅谈HashMap以及重写hashCode()和equals()方法

HashMap是JAVA中一个很重要的集合类型。用于存储Key-Value对。 所谓Key-Value对就是一个键对应一个值,Key和Value之间是映射关系。比如我们查询英汉词典的时候,一个中文词语对应一个英文单词(假设只有一个)。 hashCode()和equals()的重写
  • u010223904
  • u010223904
  • 2015-06-01 01:33
  • 5273

java 重写HashCode和equals方法以及 HashMap集合 增 删 改 查

HashMap集合 增 删 改 查 import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import com.cz.pojo.Person;...
  • ranmudaofa
  • ranmudaofa
  • 2014-09-22 23:00
  • 4598
    老铁们,支付宝扫一扫,领红包啦!
    扫一扫,红包是你的!对,你没看错,天天都有效,可以直接保存,天天扫,天天拿。不信?搞一哈,就造啦!!!
    个人资料
    • 访问:2422474次
    • 积分:21026
    • 等级:
    • 排名:第435名
    • 原创:330篇
    • 转载:79篇
    • 译文:4篇
    • 评论:1462条
    大 师 兄 说
    • 交流群:321964905(新建)
    • 我扣扣:1181415316
    • 我邮箱:cmshome@163.com
    • 我格言:"习惯就好"坑了多少人
    • 暂时在:帝都
    • 曾工作:成都
    • 我爱好:海贼王
    • 我爱好:英雄杀
    • 我家乡:济源市
    • 我爱好:写bug
    • 求求求:有问题就留言吧
    • 为啥呢:大师兄是一直在维护的
      你觉得本博文对你有用吗 有用,那就请点赞留言。 暂时没用,也请不要踩。
    博客专栏
    最新评论