java是面向对象的编程语言,而基本数据类型并不是对象,于是java对基本数据类型包装了对应的类,如 int-Integer、char-Character等,这些类称之为包装类。
一、包装类用于泛型
何为泛型?实例化一个对象,就是开辟一块空间用于存储对象的属性,Java是强类型编程语言,在声明属性时,需要指定属性的数据类型,如果对象的某个属性是Object,意味着这个属性可以是任意类型(基本数据类型除外),因为Object类是所有类的父类,但是在获取和修改属性数据时,需要强制类型转换。可如果在定义这个类时,既不希望这个属性的类型是Object,但又想有一个属性用于占位置,以便在调用时用于存储数据,于是抽象一个类类型T,用于占位置,实例化时再具体指明这个属性的数据类型,泛型的概念就产生了。
class AAA{
String s;
int i;
Object o;
T t;
}
方法传参是将数据给到形参变量,而泛型传参是指在实例化对象时,将数据类型给到属性,指明该属性的数据类型。泛型是编译时的概念,即在编译时,可以用一个参数T 指代属性的数据类型,在运行后的字节码文件中,擦除机制会将T类型擦除为Object类型,实例化之后再转为其他数据类型,所以在后续字节码文件中,Object类型会转为实际的类型。
那为何还用参数T而不用Object?用参数T而不用Object是在编写代码时,不用考虑类型转换问题,而且编译器会自动校验后续代码中属性的值和类型是否匹配,而写作Object不一定能在编译阶段发现问题。
基本数据类型并不属于类对象,在泛型传参中也就无法传递基本数据类型,因此使用包装类,可以传递包装类类型。
二、包装类用于集合类
java对于数据的存储结构提供了集合类,如ArrayList、LinkedList、Stack、HashMap等,集合类在实例化时,需要指明存储数据的数据类型。而java在对于基本数据类型和包装类类型之间的类型转换,提供了自动装箱(int -> Integer)和自动拆箱(Integer -> int)操作,实际对于集合类的操作类型,仍然是包装类类型。
List l = new ArrayList();
l.add(1);
三、前后端交互中的方法传参
前端给后端发送请求,请求中的参数可以有值,也可以没有值,没有值即传递的是null值,如果用基本数据类型接收,基本数据类型是不能和null值比较的(==或!=),那么程序就可能崩溃,而用包装类接收时,包装类是可以和null值比较的。
四、Integer的高速缓存
由于包装类是类对象,对象的创建和销毁是存在一定的性能开销的,因此针对int类型的数据,Integer提供了对象缓存机制。Integer在初始化时,针对较小的整数(默认-128 - 127)会存储在一个数组中,对于没有超过缓存范围的数据,默认从数组中取,即引用相同,而超过缓存的数据,则新建对象存储(引用不同),从而节省内存提高性能。
Integer a = 100;
Integer b = 100;
a == b;
标签:java,包装,Object,数据类型,类型,Integer,属性
From: https://blog.csdn.net/qq_45476544/article/details/137162452