"equals"和"=="的区别

本文详细解析了Java中equals方法与==运算符的区别,包括基本数据类型与引用数据类型的比较方式,以及String类型和未覆写equals方法的引用数据类型的特殊处理。同时,深入探讨了equals方法在String和包装类中的实现原理。

“equals”

基本数据类型:没有equal方法;
引用数据类型:由于String,八种基本数据类型的包装类都覆写了equals方法,因此equals比较的是内容;其他引用数据类型如果没有覆写equals方法,则判断是否指向同一个引用。

“==”

基本数据类型:判断值是否相等;
引用数据类型:判断是否指向同一个引用。

下面来看示例代码:

/**
 * 测试equals和== 的区别
 */
public class verify1 {
    verify1() {
    }

    public static void main(String[] args) {
        //基本数据类型:“==”   比较值
        int a = 1;
        int b = 1;
        System.out.println(a == b);//true  值相等

        //基本数据类型的包装类:“==”  比较引用
        Integer A = new Integer(1);
        Integer B = new Integer(1);
        Integer C = new Integer(2);
        System.out.println(A == B);//false   地址不相等,没有指向同一个引用
        System.out.println(A == C);//false   地址不相等,没有指向同一个引用
        //基本数据类型的包装类:“equals”  比较内容
        System.out.println(A.equals(B));//true   内容相等
        System.out.println(A.equals(C));//false  内容不相等

        //String类型:“==” 比较引用
        String S1 = new String("aaa");
        String S2 = new String("aaa");
        String S3 = new String("bbb");
        System.out.println(S1 == S2);//false  地址不相等,没有指向同一个引用
        System.out.println(S1 == S3);//false  地址不相等,没有指向同一个引用
        //String类型:“equals”  比较内容
        System.out.println(S1.equals(S2));//true  内容相等
        System.out.println(S1.equals(S3));//false 内容不相等

        //字符串常量:  "==" 比较引用
        String s1 = "aaa";
        String s2 = "aaa";
        String s3 = "ccc";
        System.out.println(s1 == s2);//true  地址相等,指向同一个引用
        System.out.println(s1 == s3);//false 地址不相等
        //字符串常量:  "equals" 比较内容
        System.out.println(s1.equals(s2));//true  内容相等
        System.out.println(s1.equals(s3));//false 内容不相等

        System.out.println(S1 == s1);//false 地址不相等,对象实例在Java堆,字符串常量在方法区的常量池
        System.out.println(s1.equals(S1));//true 内容相等
        System.out.println(S1.equals(s1));//true 内容相等

        //没有覆写equals方法的引用数据类型: "==" 比较引用
        verify1 v1 = new verify1();
        verify1 v2 = new verify1();
        System.out.println(v1 == v2);//false 地址不相等
        //没有覆写equals方法的引用数据类型: "equals" 比较引用
        System.out.println(v1.equals(v2));//false 地址不相等

    }
}

String重写了equals方法

public boolean equals(Object anObject) {   // 方法签名与 Object类 中的一致
    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;
}

判断过程如下:
1.先进行引用判断
2.不是同一引用再进行类型判断
3.是同一类型再进行内容判断

其他基本数据的包装类的equals方法的实现同样可以参考上述判断过程


Object类中的equals方法

Object类中的equals方法用于检测两个对象是否指向同一个引用,如果指向同一个引用,则他们是相等的。

Java.util.Objects 7
	• Static boolean  equals(Object a, Object b)
	如果a和b都为null,返回true;如果只有其中一个为null,返回false;都不为null,返回a.equals(b).

但是有时候我们还需要检测两个对象的状态的相等性,必须两个雇员的姓名,联系方式,电话等等都一样,才认为他们是相等的,这时候就需要覆写equals方法。
在这里插入图片描述

equals和hashCode()的关系

  • 如果a.equals(b)返回true,则a和b的hashCode()一定相等;
  • 如果a.equals(b)返回false, 则a和b的hashCode()可以相等,也可以不相等;
  • 如果a和b 的hashCode()方法返回结果不相等,则a.equals(b)一定返回false.
   ==equals方法究竟有什么区别?   == 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。   如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。   equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:     String a=new String("foo");     String b=new String("foo");   两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即ab中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值