==和equals的区别是什么?

==和equals的区别是什么?

对于基本类型和引用类型==的作用效果是不同的,如下所示:
· 基本类型:比较的是值是否相同;
· 引用类型:比较的是引用是否相同;
代码示例:

/**
 * 采用字面值方式赋值
 */
String str1="abc";
String str2="abc";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println(str1.hashCode()==str2.hashCode());
System.out.println("=============");

/**
 * 采用new关键字创建一个字符串对象
 */

String str_1=new String("abc");
String str_2=new String("abc");

System.out.println(str_1==str_2);
System.out.println(str_1.equals(str_2));
System.out.println(str_1.hashCode()==str_2.hashCode());

以上代码运行结果:

true
true
true
=============
false
true
true

代码解读:因为str1和str2指向的是同一个引用,所以<mark>也是true,而new String()方法则重新开辟了内存空间所以</mark>结果为false,而equals比较的一直都是值,所以结果都为true。
equals解读:
equals本质上就是==,只不过是String和Integer等重写了equals方法,把它变成了值比较。看如下代码。
首先来看默认情况下equals比较一个相同值的对象,代码如下:

public class Person {

    String name;

   public  Person(String name){
       this.name=name;
   }

    public static void main(String[] args) {
        Person person=new Person("马云");
        Person person1=new Person("马云");
        System.out.println(person.equals(person1));  //false
    }

输出结果很出乎我们的意料啊,竟然是false?接下来我们看看equals源码就知道了,源码如下:

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

这样我们就可以看出来为什么了,原来equals的本质就是==。
那如果是这样的话,为什么相同的String对象返回的是true?如下代码:

String str_1=new String("微信公众号:IT研读间");
String str_2=new String("微信公众号:IT研读间");
System.out.println(str_1.equals(str_2));   //true

那我们来看看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方法,将之前的引用比较改成了值比较。

我们来做个总结:
==对于基本类型来说是值比较,对于引用类型来说是比较的引用;
equals默认情况下是引用比较,只是很多类重写了equals方法,比如String、Integer等把它改成了值比较,所以一般情况下equals比较的是值是否相等。

全部评论

相关推荐

09-18 20:41
门头沟学院 Java
要个offer怎么这...:哈哈哈哈哈哈,我也拿了0x10000000个offer,秋招温啦啦啦,好开心
我的秋招日记
点赞 评论 收藏
分享
牛客48826091...:哥们胸肌挺好看
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务