1、java中的八种数据类型都有一个包装类型与之对应:
2、装箱与拆箱
(1)装箱与拆箱
装箱:把基本的数据类型转换为对应的包装类型
拆箱:把包装类型转换为对应的基本数据类型
(2)自动装箱与自动拆箱
Integer i=1;//自动装箱 int j=i;//自动拆箱
自动装箱:在上面的例子中实际上是在编译时期调用的Integer.valueOf()方法来装箱
自动拆箱:执行的是int j=i.intValue();
(3)手动装箱与手动拆箱
Integer i=Integer.valueOf(1);//手动装箱 int j=i.intValue();//手动拆箱
3、为什么有了基本数据类型还要有包装类型
java是一个面向对象的语言,基本数据类型不具有面向对象的特性(封装、继承、多态、抽象)。
(1)包装类型里面封装了很多属性和方法:
如:最大值、最小值
调用的是类中的静态方法:
public class Packaging {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
}
基本数据类型和对象的转换:
基本数据类型转化为对象,直接用Integer的构造方法:
Integer num1 = new Integer(123); Integer num2 = new Integer("321");//用字符串转换
调用Integer的valueOf方法:
对象转化为基本数据类型:
(2)基本数据类型在没有初始化的时候为值0,包装类在没有初始化的时候为null:
基本数据类型:
定义学生的年龄为int类型:
private String snum; private String sname; private int age;
未初始化学生的年龄,输出学生对象的信息:
Student student=new Student("202019","zhai"); System.out.println(student.toString());
Student{snum='202019', sname='zhai', age=0}
包装类型:
private String snum; private String sname; private Integer age;
Student student=new Student("202019","zhai"); System.out.println(student.toString());
Student{snum='202019', sname='zhai', age=null}
(3)缓存区(Integer为例,其它封装类型也存在这种机制)
缓存值默认是-128~127 ,也就是说如果新创建的对象的值在此范围,就会直接从缓存区取出一个对象,否则,new一个Integer类型的对象。
源码:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
测试:
Integer num1=1; Integer num2=1; System.out.println(num1==num2); Integer num3=new Integer(2020); Integer num4=new Integer(2020); System.out.println(num3==num4);
true false
减少创建新对象的次数,提高代码性能。