Java中“==”、equals()、hashcode()的区别与联系。


     在Java中判断两个对象是否相等的方法有许多,这里记录一下我所理解的三个方法之间的区别与联系


     首先我们最长用到的应该是“==”,毕竟很多人是从C语言入门编程的,所以更多的时候我们会习惯使用“==”来判断两个对象是否相等,“==”是Java语言为我们预留的关键字,用于比较两个对象是否相等。刚刚接触Java的时候有人告诉我Java中是不存在指针的(根据个人理解而异),但是我的理解是,C语言中指针的含义是存储数据的地址,那么Java中的数据也是存储在内存中的当然也有地址,没错就是我们所说的对象,我所理解的对象不仅仅是现实实物的抽象化产物,说白了也就是我们在C语言中所理解的指针,也就是存储数据的地址(便于初学者理解的说法)。那么重点来了,“==”所比较的就是两个对象所存储的数据是否在同一地址内(说了这么多其实总结起来就一句话)。

     例如:

  String s1 = new String("xupt");
  String s2 = new String("xupt");
  //此时输出的结果为false
  System.out.println(s1 == s2);

     这里我们分析一下输出的结果

     首先定义了一个String类型的对象s1,并为其开辟了一段新的内存,其中存储的值为xupt

     然后又定义了一个String类型的对象s2,为其开辟了一段新的内存,其中存储的值也为xupt

     注意我上面的用词,s2是新开辟的另一端内存,所以经过“==”比较过后两段不同的内存当然不会是相等的,所以输出的结果是False。

     


      接下来我们说说equals()方法,这个方法是Object类提供的方法,我们都知道Object类是所有类的基类(所有类都继承自Object类),所以每一个类都有equals()方法。equals()方法的作用也是比较两个对象是否相等(此处与“==”作用一致),那么equals()方法又有什么用呢?我们之前说过所有的类都继承自Object类,也就都继承了Object类中的方法,但是作用都是一样的吗?当然不是的,如果一样的话就没有其出现的必要性了,因为“==”完全可以胜任的功能为什么要多写一个方法去提供这种功能呢?众所周知,Java三大特性:继承、封装、多态。继承下来后我们是可以重写的啊!那么是不是这样呢?我们来看一下。

        首先我们来看一下Object类中提供的equals()方法

public boolean equals(Object var1) {
        return this == var1;
}
        没错,是和“==”相同的,那么为了验证我们之前所说的重写我们来看看String类中的源码
public boolean equals(Object var1) {
        if (this == var1) {
            return true;
        } else {
            if (var1 instanceof String) {
                String var2 = (String)var1;
                int var3 = this.value.length;
                if (var3 == var2.value.length) {
                    char[] var4 = this.value;
                    char[] var5 = var2.value;

                    for(int var6 = 0; var3-- != 0; ++var6) {
                        if (var4[var6] != var5[var6]) {
                            return false;
                        }
                    }

                    return true;
                }
            }

            return false;
        }
    }

        很明显,和Object类中提供的方法是不一样的,这里我们就不一一解释源码了,有点C语言基础或者Java基础的大佬们都能看出来这是比较字符串是否相等的方法,所以String类中通过重写改变了equals()方法的功能,也就印证了我们上面的说法,这里要提一下,很多初学者会为了方便记忆理解成“==”是用作比较地址而equals()是用作比较内容,这里就错了,equals()根据特定的类其重写的内容是不一定的。



        说完了常用的两个我们再来说说hashcode()方法,这个方法也是Object类所提供的,是通过一定的算法算出存储内容的hash码,也用作比较两个对象是否相等,说白了就是和equals()的方法一样,只是这个方法一般开发者不会去主动调用,所以在改写equals()的同时我们一定要改写hashcode()方法并且保证两个方法在参数相同的时候输出的结果是一致的。



        综上所述就是我们常用来比较两个对象是否相等的方法之间的区别。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值