JAVA之equals对于引用类型比较的方式不同呢

来源:互联网 发布:阿里云解析自动更新ip 编辑:程序博客网 时间:2024/06/05 10:56

因为equals这个方法是Object,所以我们首先查看一下Object对与此方法的解释:

Objec类equals方法(源码):

    public boolean equals(Object obj) {        return (this == obj);    }

源码分析:在“JAVA之“==”和“equals”的区别”这篇博客中,我详细的说明了“==”的作用,除了基本数据类型以外,使用它比较的都是两个变量的引用地址。由此知,Object中的equals方法比较的是引用的地址。

我们都知道在JAVA中,Object是所有对象的父类,那么为什么字符串,基本数据类型的包装类型中使用equals比较的是两个变量的内容,而不是两个变量的地址呢?

官方对于Object对象的equals方法的解释:

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
官方解释到,Object的equals方法是可以被重写的,并且在重写时,也必须重写hashCode方法。

从文档中得知,equals方法可以被重写,所以在字符串中,基本数据类型的包装类型中此方法比较的发生变化,是不是此方法被重写了呢?我们看源码,如下:

String类源码:

 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;    }    public int hashCode() {        int h = hash;        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;    }

代码分析:

同过查看String类的源码,我们发现String对象确实重写了Object对象equals方法。

 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;    }
Integer类源码:

    public boolean equals(Object obj) {        if (obj instanceof Integer) {            return value == ((Integer)obj).intValue();        }        return false;    }    @Override    public int hashCode() {        return Integer.hashCode(value);    }
代码分析:

Integer跟String一样,重写了Ojbect对象的方法。return value == ((Integer)obj).intValue(); 在这句代码中,首先将obj强转成Integer对象,在使用intValue转成了int,所以最终采用的是基本数据类型的比较。

总结:以上是对于equls方法的分析。如有不足,望大神们多多指点。谢谢。


阅读全文
1 0