java中equals(),hashcode()和==的区别
一、==
java中的数据类型,可分为两种:
- 基本数据类型,也称原始数据类型
byte,short,int,long,float,double,char,boolean 他们之间的比较,应该用双等号(==),这是比较他们的值;
- 引用类型(类、接口、数组)
当用==对它们进行比较的时候,比较的是它们在内存中的存放地址,所以,除非是同一个new出来的对象,他们比较的结果为true,否则为false;对象是存放在堆中的,栈中存放在是对象的引用(地址)。
由此可见,==是对栈中的值进行比较。如果要比对堆中的对象是否相同,那就要重写equals方法了。
如下的情况要注意:
Integer a1 = 127;
Integer b1 = 127;
Integer a = 128;
Integer b = 128;
a1==b1,是为true,但a==b是返为false ,为什么呢?
看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer b1 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。
所以a1==b1:true;a==b:false
二、equals()
1、默认情况(没有覆盖equals方法),equals方法都是调用Object类的equals方法,而Object类的equals方法是判断对象的内存地址引用是不是同一个地址;
2、如果类覆盖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采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
散列函数,散列算法,哈希函数。
是一种从任何一种数据中创建小的数字“指纹”的方法。
散列函数将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。
好的散列函数在输入域中很少出现散列冲突。