"equals"和"=="的区别

“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.
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值