java中"=="和equals的区别

java中"=="和equals的区别

在初学java时,你是否碰到过下面的代码:

String str1=new String("hello");
String str2=new String("hello");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));

输出结果为:false true

为什么会这样?"==" 和equals的区别是什么?今天就一起来了解一下java中 " ==" 和equals方法的不同之处:

1."=="比较的内容

==操作符比较的是两个变量的值是否相等,对于引用变量表示的是两个变量在堆中存储的地址是否相等。下面看几个例子:

public class Test {
    public static void main(String[] args) {
        int n=11;
        int m=11;
        System.out.println(n==m);
        
        String str=new String("hello");
        String str1=new String("hello");
        String str2=new String("hello");
        System.out.println(str1==str2);

        str1=str;
        str2=str;
        System.out.println(str1==str2);
    }
}

输出结果为:true false true

(1)对于第一种情况,变量类型为基本数据类型,直接存储的是变量的“值”,因此在用关系操作符 == 来进行比较时,比较的就是 “值” 本身。

比如:

int n=11int m=11;

变量n和变量m都是直接存储的"11"这个数值,所以用==比较的时候结果是true。

(2)对于第二种和第三种情况,变量类型为引用类型的变量,存储的并不是“值”本身,而是与其关联的对象的在内存中地址。但结果为什么会不同?

原来,程序在运行时会创建一个字符串缓冲池,当创建一个字符串时,程序首先会在这个String缓冲池中寻找相同值的对象,在第二段程序中,使用了 new 操作符,它明白地告诉程序:“我要一个新的!”于是新的 String 对象被创建在内存中,他们的值相同,但位置不同,所以用 == 比较时返回false;

而在第三段程序中时,都让 str1 和 str2 指向了 str 指向的对象,那么得到的结果毫无疑问是 true。

扫描二维码关注公众号,回复: 10832320 查看本文章

2.equals比较的内容

equals 方法是基类 Object中 的方法,因此对于所有的继承于 Object 的类都会有该方法。为了更直观地理解 equals 方法的作用,直接看 Object 类中 equals 方法的实现。
在这里插入图片描述
很显然,在 Object 类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。
但为什么下面这段代码的输出结果是 true ?

public class Test {
    public static void main(String[] args) {
        String str1=new String("hello");
        String str2=new String("hello");
        System.out.println(str1.equals(str2));
    }
}

下面是String类中equals方法的具体实现:在这里插入图片描述
可以看出,String 类对 equals 方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。其他的一些类诸如 Double,Date,Integer 等,都对 equals 方法进行了重写用来比较指向的对象所存储的内容是否相等。

3.总结

(1)对于 == :
如果作用于基本数据类型的变量,则直接比较其存储的“值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址。

(2)对于 equals 方法:
注意:equals 方法不能作用于基本数据类型的变量。
如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如 String、Date 等类对 equals 方法进行了重写的话,比较的是所指向的对象的内容。

发布了71 篇原创文章 · 获赞 2 · 访问量 7480

猜你喜欢

转载自blog.csdn.net/weixin_42512675/article/details/102988346