一、了解包装类
(1)在java5中增添了两个新特性,自动装箱和拆箱,因为基本类型的广泛使用,同时Java
又是面向对象的编程语言,所以提供了包装类。
(2)基本数据类型包括:byte、short、int、long、float、double、char、boolean
对应的包装类为:Byte、Short、Intger、Float、Double、Character、Boolean。
二、使用包装类的原因
java是面向对象的语言,很多类和方法中的参数都需使用对象(例如集合),但基本数据类型却不是面向对象的,这就造成了很多不便。
ArrayList<int> list = new Arrays<>();无法通过编译,为了解决这个问题,我们就将8个基本数据进行包装,使他们具有对象的性质,包括可以添加属性和方法,在java.lang包中。
三、拆箱与装箱
其实就是基本数据类型和包装类进行相互转换,将基本数据类型转化为对应类型的包装类的过程叫“装箱”;将包装类转为对应类型的基本数据类型的过程叫“拆箱”
int——>Integer 装箱
Integer——>int 拆箱
Integer a=0;
for(int i =0;i<100;i++){
a=a+i;
}
在这串代码中
在给a赋值的时候就发生了自动装箱
在运算过程中发生了自动拆箱
装箱
int num=23;
Integer i = Integer.valueOf(num);
Integer i =23;
拆箱
Integer num=new Integer(10);
int num=10;
Float sum=new Float(20.2);
folat sum=20.2;
四、基本类型与包装类的区别
public class test{
public static void main(String[] args){
int i=128;
Ingeter i2=128;
Ingeter i3=new Ingeter(128);
System.out.println(i==i2);//Ingeter会自动拆箱为int,为true
System.out.println(1==i3);//Ingeter会自动拆箱为int,为true
Intrger i4=127;
Ingrter i5=127;
System.out.println(i4==i5)//true
Intrger i6=128;
Ingrter i7=128;
System.out.println(i4==i5)//false
Ingeter i8=new Ingeter(127);
System.out.println(i5==i8);//false
Integer i9 = new Integer(128);
Integer i10 = new Integer(123);
System.out.println(i9 == i10); //false
}
}
为什么i4和i5比的事true,而i6和i7比是false?英文valueOf()函数,这个函数对于-128到127之间的数就会进行缓存,在第一次创建i4=127时就进行了缓存,下次再写Integer i5=127时,就会从缓存中直接拿去,就不用new新对象了。
因为创建新对象就在堆中,所有i5和i8以及i9和i10 因为对象不一样为false;
四、什么时候进行自动拆箱与装箱
其实很简单(就是在需要对象的时候就装箱需要基本类型的时候就拆箱)
(1)添加到集合中时候,进行的事自动装箱
(2)涉及到运算的时候,加减乘除以及比较equals,compare to 进行自动拆箱
注意:于Integer valueOf(int i)方法中有IntegerCache()类,在自动装箱的过程中有个条件判断
if (i >= IntegerCache.low && i <= IntegerCache.high)
该方法总是缓存-128 到 127之间的值,同时针对超出这个范围的值也是可能缓存的。
六、总结
1、使用包装类的原因:java是面向对象的语言,很多类和方法的参数都需要使用对象。但是基本数据类型不是面向对象的,就造成了很多的不方便。
2.拆箱与装箱的概念:基本数据类型转为包装类的过程就叫装箱,反过来来说就是拆箱
3.java为了简便拆箱与装箱提供了自动拆装箱的功能,对于Ingeter,拆箱的过程就是通过I那个图尔实体调用intValue()方法;装箱的过程就是调用了Ingeter.valueOf()方法,帮你直接new了一个Ingeter对象
建议使用valueOf() 方法创建一个包装类实例而不是直接使用构造方法,因为该方法可以走缓存提高性能