java里的==和equals,int和Integer的相等判断
1、“==表示比较地址,equals表示比较属性”这句话是错的
论证为什么是错的,思考一个问题:int a = 1; int b = 1; a == b 是true还是false?按照上面话,比较的是地址,自然是false了,但实际情况却是true,可以得出上面前半句是错误的
代码
int a = 1;
int b = 1;
System.out.println("a==b -> " + (a==b));
结果
a==b ->true
2、==表示真正的意思是什么
从概念方面来说:
- 基本数据类型:变量名指向具体的数值
- 引用类型:变量名指向存储数据的内存地址,即变量名指向hash值
从内存构建方面来说:
- 基本数据类型:变量声明了,jvm就会立刻给它分内存空间
- 引用类型:声明时,不会立刻分配内存,而是存储了一个内存地址,指向内存中的对象,内存中的对象有三部分组成:对象头+实例数据+对齐数据
当基本数据类型使用 == 比较时,由于变量名指向的是具体的数值,比较的是值是否相等,而应用类型使用 == 比较时,由于变量名指向的是内存地址,拿两个地址来比较,这样就造成了 == 是比较地址的错误。
3、equals方法是针对引用类型比较的,基本数据类型没有equals方法
equals方法是针对引用类型比较的,基本数据类型没有equals方法,来自于所有类的祖先Object类,判断成员变量是否相等使用equals方法,equals方法需要重写用来比较每个成员变量是否相等。
4、“重写equals方法就需要重写hashCode方法”也是错误的
既然重写了equals方法,就可以判断成员变量是否相等,为什么要