为什么设计包装类?
Java是一门面向对象的语言,但是Java中的基本数据类型(byte,short,int,long,char,boolean,float,double)并不具备对象的性质,即没有成员变量和成员方法可以调用,但是在实际中,我们经常需要将基本数据类型转化成对象,以便于操作。为了弥补这个缺陷,Java提供了包装类。
什么是包装类?
包装类的本质就是将基本数据类型以及一些辅助方法包装到类中,即将基本数据类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法吗,丰富了基本类型的操作。
包装类的使用?
(1)作为和基本数据类型对应的类型存在,方便涉及到对象的操作,如集合等操作。
(2)包含每种基本数据类型的相关属性,如最大值,最小值等,以及相关的操作方法(用于基本数据类型,包装类,字符串之间的相互转化)---------intValue()方法和valueOf()方法的使用
基本数据类型和包装类的相互转化:
Integer a = new Integer(100);
Integer b = Integer.valueOf(100);
int a1= a.intValue();
int b1=b.intValue();
在上述代码中,展示了基本数据类型和包装类的相互转化,基本数据类型转化为包装类有两种方式,分别是使用new关键字和包装类的valueOf()方法;包装类转化为基本数据类型则采用intValue()方法。
字符串和包装类的相互转化:
Integer a = new Integer("444");
Integer b = Integer.parseInt("999");
String a1 = a.toString();
String b1 = b.toString();
上述代码中,展示了字符串和包装类的相互转化,字符串转化为包装类有两种方式,分别是使用new关键字和包装类的parseInt()方法;包装类转化为字符串则采用toString()方法。
自动装箱与拆箱?
在JDK1.5之后,Java引入了自动装箱与拆箱,自动装箱与拆箱就是将基本数据类型和包装类之间进行自动转换。
自动装箱:将基本数据类型转换成包装类对象。基本数据类型的数据处于需要对象的环境中时,会自动换为“对象”。系统调用valueOf()方法进行自动装箱。
Integer a = 4;
Integer a = Integer.valueOf(4);
上述代码中,Integer a =4就是将基本数据类型4转换成包装类对象,其本质是JVM执行了Integer a =Integer.valueOf(4)这样的操作,这就是Java的自动装箱。
自动拆箱:将包装类转换成基本数据类型,系统调用**Value()(如intValue(),doubleValue()等)方法进行自动拆箱。
Integer a = Integer.valueOf(4);
int b=a;
int b=a.intValue();
上述代码中,int b=a就是将包装类对象a转换成基本数据类型b,其本质是JVM执行了int b=a.intValue();这样的操作,这就是Java的自动封箱。
类型转化?
int到Integer:
(1)使用Integer类的构造方法
(2)使用Integer类内部的valueOf()方法
(3)自动装箱
Integer到int:
(1)使用Integer类内部intValue()方法
(2)自动拆箱
包装类的缓存问题?
整型,char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理,其目的是提高效率。
缓存处理的原理为:如果数据在-128~127这个区间,那么在类加载就已经为该区间的每个数值创建了对象,并将这256个对象存放到一个名为cache的数组中。每当自动装箱过程发生时,就会判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过new调用包装类的构造方法来创建对象。
Integer in1=1234;
Integer in2=1234;
System.out.println(in1==in2); //false
System.out.println(in1.equals(in2)); //ture
Integer in3=45;
Integer in4=45;
System.out.println(in3==in4); //true
System.out.println(in3.equals(in4)); //true
在上述代码中,基本数据类型1234进行自动装箱时,通过比较1234不在-128~127这个区间,则在堆中创建一个新的对象in1,同理在堆中创建一个新的对象in2,由于in1和in2不是同一个对象,故其内存地址不同;基本数据类型45进行自动装箱时,通过比较45在-128~127这个区间,则直接获取cache数组中已经创建好的45包装类对象的引用,并赋值给in3,同理赋值给in4,由于in3和in4指向同一个包装类对象,故其内存地址相同。