为何要包装类
1. 在面向对象中,”一切皆对象”,但基本数据类型的特殊存在不太符合这一理念,面向对象面向得并不纯粹,因为基本类型变量并不是对象;
2. 涉及进制间的转换的算法,数据类型间的基本操作;如果都要我们来实现,那工作量就太大了;
3. Java的集合框架并不支持基本数据类型的存储,只支持对象类型的存储,支持基本类型存储的就只有数组了;
故此,针对Java基本数据类型封装了包装类,每一个基本类型都有一个对应的包装类,以下是详情:
八大基本数据类型的包装类都使用final修饰,都是最终类,都不能被继承。
拆箱和装箱
装箱:把基本类型数据转成对应的包装类对象。
方式一:Integer i = Integer.value(13);
方式二:Integer i = new Integer(13);
拆箱:把包装类对象转成对应的基本数据类型数据。
int value = i.intValue();
自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)
在Java 5之前的版本中,基本数据类型和包装类之间的转换是需要手动进行的,但Sun公司从Java5开始提供了的自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)操作 ;
自动装箱:可以把一个基本类型变量直接赋给对应的包装类型变量。比如:Integer i = 13;
自动拆箱:允许把包装类对象直接赋给对应的基本数据类型变量。
比如:Integer i = new Integer(13);
Int j = i;
自动装箱和自动拆箱,也是一个语法糖/编译器级别新特性,在底层依然是手动装箱、拆箱操作;但是在装箱操作中使用的是Integer.valueOf()方法,而不是直接new Integer();其他的几个包装类也是如此,装箱操作中使用的是各自的valueOf()方法。
switch 对包装类的支持
switch支持的基本数据类型:byte,short,char,int;也支持对应的包装类。因为在底层,switch中会对包装类做手动拆箱操作。
考虑后面这样一句代码:Object obj = 17;
在上述代码语句中有如下的操作:
1. 自动装箱,把17自动装箱为Integer类型: Integer i = 17;
2. 引用的自动类型转换,把子类对象赋给父类变量: Object obj = i; 因为Object类是所有Java类的父类;因此,Object类型可以接受一切数据类型的值;Object数组:Object[],该数组可以保存一切数据类型。所以:Object[] arr = {“A”,12,3.14,true}; // 这是完全可行的
包装类的常用操作方法(以Integer为例)
1. 包装类中的常量:
MAX_VALUE :最大值
MIN_VALUE :最小值
SIZE :变量在内存中存储数据占多少位
TYPE :对应的基本类型
2. 包装类的构造器:创建包装类对象
案例代码如下所示:
其他的几个包装类型也是这样的规律,具体实现查看源码即可。
3. 基本类型和包装类型的转换(装箱和拆箱)
装箱:
拆箱:
4. String和基本类型/包装类型之间的转换操作
把String转换为包装类类型
把包装类对象转换为String
把基本数据类型转换为String
把String转换为基本数据类型
parseXxx(String s) : xxx表示8大基本数据类型,如:
5. 对于Boolean来说
无论是使用new Boolean(“”); 还是Boolean.valueOf(“”), 只有使用true/TRUE会被认为是true,其他都是false。
包装类中的缓存设计
在包装类中提供了缓存设计,会对一定范围内的数据作缓存,如果数据在范围内,会优先从缓存中取数据,超出范围才会创建新对象;Byte、Short、Integer、Long:缓存[-128,127]区间的数据;Character:缓存[0,127]区间的数据;包装类中的缓存设计,也称为享元模式。
缓存设计会在包装类中的valueOf()方法中实现,所以才会推荐使用valueOf()方法来实现拆箱操作,如下是Integer类的valueOf()源码:
再查看缓存实现细节:
通过查看源码可知,JVM会对-128 到 127之间的做缓存,如果你的变量值在这个范围内,就会优先从缓存中取数据,否则就会创建新对象。当然这个缓存区间也是可是设置的。
那么以下这个例子就可以解释了:
我们再来看Integer的equals方法的实现源码:
可以发现,包装类在比较时会将包装类型拆箱为基本数据类型,并使用==做比较。
包装类型和基本数据类型的区别
包装类型和基本数据类型的区别(以Integer与int的区别为例):
1.默认值:
int(基本数据类型呢)的默认值是0。
Integer(包装类型)的默认值为null。Integer既可以表示null,又可以表示0。
2.包装类中提供了该类型相关的很多算法操作方法:
3.在集合框架中,只能存储对象类型,不能存储基本数据类型值。
4.Integer和int并不是相同的数据类型,尽管值是相同的。Integer是一个类,可以实例化为对象,但int只是一个基本数据类型。
5.在JVM中,基本类型变量存储在栈中的,而包装类型对象存放于堆中。
其实,包装类就是把基本数据类对象化,包装类是基本数据类型的超集;在开发中,建议成员变量优先使用包装类型,局部变量优先考虑基本数据类型。
完结。老夫虽不正经,但老夫一身的才华