Java中 == 和 equals 的区别

培训教学 潘老师 8个月前 (08-29) 176 ℃ (0) 扫码查看

在Java编程中,==equals 都是用来比较对象的操作符,但它们在比较对象时有着不同的用途和行为。理解它们之间的区别对于正确地比较对象是至关重要的。

1. == 操作符

在使用 == 进行比较时,其作用效果是不同的,可以总结如下:

基本类型:在进行基本类型的比较时,实际上是在比较它们的值是否相同。如果两个基本类型的值相等,那么它们会被判定为相等。

引用类型:对于引用类型,比如对象或者数组,使用 == 进行比较时,实际上是在比较它们的引用是否相同。也就是说,如果两个引用类型变量引用了同一个对象或数组,那么它们会被认为是相等的。

示例代码:

String x = "hello";
String y = "hello";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

原因解析

因为 x 和 y 指向的是同一个“hello”字符串地址引用,因为类似String x=”hello”;这个语句的含义,是在运行时的常量池中赋值,相同的字符串只会分配一次,第二次是将内存池中这个指向该对象的引用返回,所以x和y其实是指向同一个内存地址,所以 == 返回 true,而 new String()方法则重写创建了内存空间,内存地址不一样,所以 == 返回为 false,而 equals 比较的一直是值,他们的值都是字符串“hello”,所以结果都返回为 true。

2. equals 方法

equals 方法是定义在 Object 类中的方法,用于比较两个对象的内容是否相等。默认情况下,equals 方法使用的是和 == 相同的引用比较,但许多类会重写 equals 方法,使其根据对象的内容来进行比较。

对于 equals 方法,实际上它本质上是 == 运算符,但某些类如 String 和 Integer 为了实现特定的功能,重写了 equals 方法,将其转变为值的比较。通过下面的代码示例,我们可以更好地理解这个概念。

首先,我们来看一个默认情况下使用 equals 方法来比较具有相同值的对象的代码:

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

    private String name;
}

Person c1 = new Person ("小明");
Person  c2 = new Person ("小明");
System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看下 equals 源码就明白了,源码如下:

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

原因就在于 equals 本质上就是 ==,那问题来了,两个相同值的 String 对象,为什么equals返回的是 true?代码如下:

String s1 = new String("小明");
String s2 = new String("小明");
System.out.println(s1.equals(s2)); // 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 类重写了 Object 的 equals 方法,把引用比较改成了值比较,因此就返回了true。

总结

总体而言,在Java中,== 运算符在处理基本类型时进行值比较,在处理引用类型时进行引用比较。而 equals 方法在默认情况下执行引用比较,但许多类(例如 String 和 Integer)已经重写了 equals 方法,使其变为值比较。因此,通常情况下,equals 方法用于比较值是否相等。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/8459.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】