equals方法比较的是内容?谁告诉你的

回复“000”获取程序员必备电子书

故事

前段时间,我给一位小伙伴做在线模拟面试的时候,随口问了一句:”说说 ==和equals方法的区别?“,结果给我回答一个equals方法是比较内容的。

我们先来说说====比较有两种情况:

1.比较的是基本数据类型

int a=100;
int b =10;
//比较的是两个变量对应的值
if(a==b){
    System.out.println("出问题了");
}

2.比较的是引用类型

Integer a=Integer.valueOf(100);
Integer b =new Integer(100); 
//比较的是a和b指向的对象地址是否相同
if(a== b){
    System.out.println("出问题了");
}

然后,我们再来说说equals方法。

equals方法是在Object中定义的,具体如下:

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

从这方法里,我们能得出结论:如果不重写equals方法,那么比较的就是两个对象地址。

至于,重写了,比较的是什么?

这就好比吃饭,在大多数人心中,提到吃饭,就会想到吃面或吃米饭。对不起,现在很多人所谓的吃饭可能就是只吃菜,并没有吃米饭或面。

下面我们来说说,两个常见类:String类和Integer类。

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类的equals方法也不是一定要比较内容,先是比较两个对象地址,然后比较长度,在比较具体内容。

Integer类中的equals方法:

public boolean equals(Object obj) {
    //比较类型
    if (obj instanceof Integer) {
        //先拆箱 再比较具体值
        //注意 这里的value 是int类型的变量
        return value == ((Integer)obj).intValue();
    }
    return false;
}

总结

这个面试题,看似很简单,我后面还可以问了另外两个三年的工作的朋友,回答也是和前面那位朋友的一样。下面对此进行一个总结:

==如果是用于基本数据类的比较,则比较的是具体值,如果比较的是引用类型(包装类型),则比较的是两个对象指向的对象地址是否相等。

equals方法,默认不重写的情况下是比较两个对象的地址是否相同。如果自己对equals方法重写了,那就得看是怎么重写的。

好了,今天就分享到这里,记得关注我,讲述一些不一样知识点,还能附带的带着你看一些源码,记住:很多好东西都在源码中才可以看到的。

(0)

相关推荐