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");
首先定义了一个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类中的源码
说完了常用的两个我们再来说说hashcode()方法,这个方法也是Object类所提供的,是通过一定的算法算出存储内容的hash码,也用作比较两个对象是否相等,说白了就是和equals()的方法一样,只是这个方法一般开发者不会去主动调用,所以在改写equals()的同时我们一定要改写hashcode()方法并且保证两个方法在参数相同的时候输出的结果是一致的。
综上所述就是我们常用来比较两个对象是否相等的方法之间的区别。
首先我们最长用到的应该是“==”,毕竟很多人是从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()方法并且保证两个方法在参数相同的时候输出的结果是一致的。
综上所述就是我们常用来比较两个对象是否相等的方法之间的区别。
相关文章推荐
- Java 中的 ==, equals 与 hashCode 的区别与联系
- java的equals和hashcode方法的区别和联系
- Java 中的 ==, equals 与 hashCode 的区别与联系
- Java hashCode() 和 equals()的联系与区别
- Java 中的 ==, equals 与 hashCode 的区别与联系
- java中hashcode和equals区别和联系
- Java == ,equals 和 hashcode 的区别和联系
- Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系
- hashcode,==,equals的区别与联系(JAVA)
- [厉害了,我的JAVA基础](十一)hashCode与equals的区别与联系
- 【java】hashCode与equals的区别与联系
- Java hashCode与equals的区别与联系
- Java中的“==”、equals和hashcode的区别与联系
- Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系
- java基础-hashCode()和equals()的本质区别和联系
- Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系
- Java—hashCode与equals的区别与联系
- java中String的等号、equals、hashcode之间的区别与联系
- Java中equals()和hashCode()的区别与联系
- hashCode与equals的区别与联系