equals和==

1、在java中equals和==在日常开发中都比较常用。

”==“对于基础数据类型比较的是值;对于引用类型比较的是引用地址值。

2、关于equals有两个equals方法要特别注意,一个是String的equals、一个是Object的equals

先看下String类的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;
    }

大致看来,是对String中的每个字符元素进行逐个比较,不等则返回false。

再来看下Object中equals方法

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

使用”==“做比较。

3、所以这里解释了一个问题,为什么要重写对象的equals方法?

因为日常开发时需要比较的经常是对象的某些值相等的情况,如果没有重写那么对象将使用Object(对象的顶层父类都是是Object)的equals方法进行对象引用地址值的比较。

4、遗留一个问题,为什么要重写对象的equals方法还要重写hashcode方法呢?

       (1)、hashCode()是Object中的native方法,用来对对象做哈希运算,可以通过算出的hashCode去定位数据。

       (2)、在java集合中如HashMap,底层查找数据使用的Object的hashCode算法,并且判断hashCode也会判断equals。如果只重写对象equals方法,那么会导致一个问题,两个不同对象内容相同使得equals为true,然而计算对象hashCode不同,导致判断错误。

        (3)、请看HashMap一段源码

if (p.hash == hash &&
    ((k = p.key) == key || (key != null && key.equals(k))))
    e = p;

你可能感兴趣的:(java,开发语言)