您的位置:首页 > 编程语言 > Java开发

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

2018-03-09 00:06 225 查看
     在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()方法并且保证两个方法在参数相同的时候输出的结果是一致的。

        综上所述就是我们常用来比较两个对象是否相等的方法之间的区别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: