java 基础之 equals 和 == 的区别

17 篇文章 0 订阅

简单看个例子

public class compare {

    int a;

    public compare(int a) {
        this.a=a;
    }
    
    public static void main(String[] args) {
        int x = 0;
        int y = 0;

        compare com=new compare(1);
        compare com1=new compare(1);

        if (x == y) {
            System.out.println("xy相等");
        } else
        {
            System.out.println("xy不相等");
        }


        System.out.println("com,com1用==比较");
        if (com == com1) {
            System.out.println("com,com1相等");
        } else
        {
            System.out.println("com,com1不相等");
        }

        System.out.println("com,com1用equels比较");
        if (com.equals(com1)) {
            System.out.println("com,com1相等");
        } else
        {
            System.out.println("com,com1不相等");
        }
    }
}

运行结果:

==比较的是引用指向的地址是否相等,可以简单理解为比较地址

x和y这两个引用都指向存放0这个数字的内存的地址,所以相等

我们经常会理解equals是用来比较内容的,通常情况下是正确的,比如说String类两个new出来的实例内容相同的话用equals比较那么就是相等的,那为什么例中com1和com的内容相等用equals比较却是不相等呢??

我们看下equals的源码:

通过源码我们可以看到居然还是用==来判断是否相等!!

那String类的equals方法又是怎么回事??不急我们看下String类的equals方法源码:

原来这两个equals方法实现不一样!!

到这里相信大家都明白了,String类之所以可以用equals方法比较内容,那是因为String 类重写了Object类的equals方法!

而所有的类都是基于Object类的

所以呢,我们如果要比较com和com1的内容就要重写Object类的equals方法:

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof compare)
        {
            compare com=(compare)obj;
            if(a==com.a)
            {
                return true;
            }
        }
        return false;
    }

运行结果:

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下:
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true 
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false

这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象, 当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象, 导致混淆,因此,就也需要重写hashcode()

 

详情参考

https://blog.csdn.net/u013679744/article/details/57074669/

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值