int和Integer的区别以及自动装箱\拆箱机制
Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
Java 为每个原始类型提供了包装类型:
- 原始类型: boolean,char,byte,short,int,long,float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
测试用例:
/**
* @author ZhangXiaoYu
* @date 2021/8/31 14:29
*/
public class AutoUnboxingTest {
public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = 3;
int c = 3;
System.out.println(a.equals(b)); //true Integer重写equals使其变为值比较
System.out.println(a == b); //false 两个引用没有引用用一对象
System.out.println(a == c); //true a自动拆箱成int类型再和c比较
/*
* 也就是说,Integer是引用类型,而int是基本类型。
* 当引用类型和引用类型进行比较时(使用==),比较的是其对象的内存地址(引用地址),而使用equals是比较的值,也就是那个3;
* equals默认是比较其引用地址,是Integer重写了equals使其变成了值比较。
* 所以由于a、b都是Integer类型,所以他两使用 == 进行比较引用地址肯定是false;
* 而a和c在进行比较的时候,由于Integer自动拆箱的特性,在Integer和int进行比较时,会将Integer拆成int类型
* 而int类型和int类型进行比较时,是值比较,所以a==c是true;
* */
}
}
Integer equals
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
未重写equals
public boolean equals(Object obj) {
return (this == obj);
}
标题:int和Integer的区别以及自动装箱\拆箱机制
作者:zzzzchen
地址:https://www.dczzs.com/articles/2021/08/31/1630392379257.html