java -为何重写equals(),还须要重写hashCode()?

1.先post这两个方法的基本定义:

equals()的定义:html

    浅谈Java中的equals和==(转)

hashCode()的定义:
 这两个方法所有都是object类定义的方法,只要继承了object类的类,默认继承这两个方法。看源码,
(1)package java.lang.Object.equals()

   可见,默认这个方法是比较这两个引用对象的实际存储的内存地址是否相同。固然,即使是同一个类建立的两个对象,他们的内存地址也是不一样的,因此,默认的equals()只有内存地址相同的对象(其实就是同一个引用对象的本身与本身的比较,这还有这样他们的地址才会相同),才会返回true。java

固然,其余的不少类继承Object后,会对equals()进行重写,它会对两个对象的类型和对象内的内容进行比较,这个equals()对字符串相同的对象会获得true。能够看下String类中重写的equals()方法。post

以下代码:ui

String s1="uiop0";
String s2="uiop0";
System.out.println(s1.equals(s2));
	 

 能够看下String类中重写的equals()方法。this

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

  

(2)package java.lang.Object.hashCode()url

Object的hashCode()默认也是对两个对象存储地址值的哈希,因此,两个内容相同的对象的哈希值也会是不一样的,因此重写hashCode()也是根据咱们需求来修改hashCode()的功能,好比,String类的hashCode()的功能,对内容相同的字符串变量,会返回相同的哈希值。若是是调用Object的hashCode()方法,由于两个String变量是两个引用对象,返回的哈希值确定不相等的。spa

看看String中的hashCode()源码:htm

   public int hashCode() {
        int h = hash;//默认hash=0
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

  能够看见,它是对两个字符串按照下面的规则,计算新的哈希值,这样算出的来两个相同字符串相变量哈希值是相等的。对象

 h = 31 * h + val[i];

 2.解释一下,为何重写equals(),还须要重写hashCode()的缘由

主要缘由是定义的新的类在使用hashMap()是实际到,key值的计算问题。当咱们用自定义的类的做为key时,怎么判断这相同的类对象的惟一性,这里涉及到hashMap()的判断机制,先比较hashCode(),当哈希值相同时,再比较equals(),这两个是配套的。blog

看先下面的详细解释:

相关文章
相关标签/搜索