java中equals,hashcode和==的区别

java中equals,hashcode和==的区别

首先Java中的数据类型分为基本数据类型和引用数据类型。

  1. 基本数据类型包括byte,short,char,int,long,float,double,boolean

  2. 引用数据类型有类、接口、数组、集合等。

==

  1. 基本数据类型使用==比较的是数值。
  2. 引用数据类型使用==比较的则是他们的地址。所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。 

equals

  1. 默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。下面是Object类中equals方法(定义的equals与==是等效的):
public boolean equals(Object obj) {  
    return (this == obj);  
    }  
  1. 要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。

这里对equals重新需要注意五点:
1. 自反性:对任意引用值X,x.equals(x)的返回值一定为true.
2. 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3. 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4. 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5. 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

hashcode

hashCode()方法返回的就是一个数值,从方法的名称上就可以看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此很容易推断出,我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能。事实上,Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。Java采用了哈希表的原理。 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际并不是)
所有散列函数都有如下一个基本特性:
1. 如果a=b,则h(a) = h(b)。
2. 如果a!=b,则h(a)与h(b)可能得到相同的散列值。

原文地址:https://www.cnblogs.com/cuianbing/p/14475112.html