equals 和 == 区别,你的回答能让面试官满意么?

equals 和 == 在面试中经常能遇到,一般的回答都是:== 是比较值,equals是比较内容之类,只是说对了很小的一部分。

那么我们来看看这两个到底有什么区别吧。

equals其实的父类的一个方法,父类是这样定义它的:

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

看着和== 很相似把,没错!父类中的equals就是在比较引用所指的那块内存中的值(如果指向对象,这是地址)。

那?为什么我们经常碰到的equals都是在比较内容?

重写equals,String类继承Object类,并且重写了父类的equals方法,方法如下

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



从上面代码可以看出最先是比较==,如果引用相等,直接就是true。然后再去比较这个对象是不是String对象的一个实例,是,则继续往下执行。
然后再把这两个字符串,拆成字符,一个一个的去比较。这样就可以比较内容了。
所以,当有人问到这两个到底有什么区别时,看代码就知道了。
#Java工程师#
全部评论
学到了~
点赞 回复 分享
发布于 2017-06-22 21:38
重写equals  还要 去重写hashCode
点赞 回复 分享
发布于 2017-06-23 09:10
LZ说的很有道理,equals方法出自Object类,它在Object类中的定义就是"==" 1.但是JDK中String类以及我们自定义的一些类在“两个对象是否相等”这个问题上的衡量标准不同,E.g. 两个所有字符相等的String对象s1,s2。应该是s1.equals(s2)返回true 2. Object中的equals和hashCode方法用于定位对象在散列表中下标;hashCode在Object的定义就是返回对象的内存起始地址(int类型),而且Java有一个约定:a.equals(b) == true,则a.hashCode()==b.hashCode(),但其逆命题不要求成立。具体原因可以看下HashMap的get()方法 因此:在override equals方法时,通常需要override hashCode方法,String的hashCode()定义就是:第0个字符*32^(n -1) + 第1个字符*32^(n--2) + ... + 第n-1个字符*32^0
点赞 回复 分享
发布于 2017-06-23 09:11
如果在集合中使用equal,如果不重写hashcode就会出问题
点赞 回复 分享
发布于 2017-06-23 12:14

相关推荐

09-29 17:44
已编辑
蔚来_测(准入职员工)
//鲨鱼辣椒:见不了了我实习了四个月上周再投筛选了一天就给我挂了
点赞 评论 收藏
分享
点赞 50 评论
分享
牛客网
牛客企业服务