Java中==和equals的异同以及hahCode

时间:2021-06-03 16:48:34

Java中关于==和equals很多人搞不明白,特别是设计到集合的时候更是一团乱。这里结合自己的学习过程给出具体的分析。

 

首先说说相等的概念,我们平时是一个东西等于另一个东西是指这两个东西完全一样。然后我们这里再重申一下Java中类的概念,Java中除了基本类型以外,其他所有的东西都可以称之为类。类在第一次使用时首先会完成初始化。然后当我们创建一个类的对象(实例)的时候,这时候其实创建了两个东西,一个是引用,其实就是一个指向堆内存的地址,这个在栈内存中;另一个是类的实体,包括成员变量和方法等。

 

Java中的==符号很接近我们说相等的这个概念。对于基本类型而言==符号就是两个常量的数值一模一样,这里可以是byte和int的比较。这很容易理解,因为int只是比byte前面多了一些0而已。对于包装类(JDK1.5后)来讲,只要包装类里装的东西一样且在一定的范围内,比如Integer会自动包装-128~127的数,其他包装类相似,则两个对象用==符号结果是true。但包装类终究是一个引用类型,所以超出一定的范围==比较的还是对象的地址。

 

Java的equals方法,其实最白话的意思就是指可以自定义的相等。比如我们假如觉得只要是活的东西都相等,那么人和狗是可以相等的。equals就是这么一种自定义的相等,而且是Object这个类里的究极方法,但是原始的Object里的equals方法其实只有一条(如下图所示)。所以原始的equals方法就是==符号,也就是比较地址,跟什么hashCode方法完全没关系。所以在实际使用中equals方法还是最好要重写一下。

 

public boolean equals(Object obj) {

        return (this == obj);

                                                                  }

再来扯一下hasCode方法,hashCode在Object方法里是native注释的,这个是调用非java语言的本地方法,无需理会,反正原生的hashCode的作用就是根据对象以及它的成员通过算法返回一个值。在使用等号和原生equals方法时,和hashCode毫无关系。

转载注明出处.

Java中==和equals的异同以及hahCode