关于8种包装类。(学习笔记)
在Java中有8种基本数据类型,分别是byte、short、int、long、float、double、boolean、char。相对应的,Java为这8种基本数据类型提供了8种包装类,分别是Byte、Short、Integer、Long、Float、Double、Boolean、Character。除了int和char的包装类写法稍有不同,其余均只需首字母大写即可。
为什么要提供这8种包装类呢?
因为有的时候我们会遇到如下这种情况:
这个时候方法需要我们传入的是一个对象,而我们实际需求是要传入一个数字的话,就会无法实现需求,但是如果有包装类的话就可以实现需求了:
如此,我们的 123 就会被包装成一个对象了,这个过程称为装箱。
装箱与拆箱(以Integer为代表)
- 八种包装类型中有6种是数字对应的包装类,他们的父类都是Number,我们可以先研究一下Number中的公共方法:
Number是一个抽象类,无法实例化对象。
Number中如下的方法:
byte byteValue()
abstract double doubleValue()
abstract float floatValue()
abstract int intValue()
abstract long longValue()
short shortValue()
这些方法其实是所有的数学包装类的子类都有的,这些方法是负责拆箱的。
基本数据类型→引用数据类型(装箱)
引用数据类型→基本数据类型(拆箱)
构造方法
Integer的构造方法有两种:
Integer(int value)
构造一个新分配的 Integer对象,该对象表示指定的 int值。
Integer(String s)
构造一个新分配 Integer对象,表示 int由指示值 String参数。
分别可以传入int类型和String类型。其余的包装类也类似如此。具体可参考帮助文档。
如上,这两种方式都是可以创建对象的。但是如果传入的字符串参数不是数字的话就会引起数字格式化异常。
自动装箱与自动拆箱
在JDK1.5之后,就已经支持自动装箱与自动拆箱了,再也不需要程序员手动装箱与拆箱了。如下:
以上代码底层其实还是创建了对象的,内存图可参考如下我从视频中的截图:
如上图内存图所示,所以如果我们执行a == b
的代码的话,最终结果是false,这就说明了这两个对象的内存地址是不同的,所以是两个不同的对象。
但是如果我们执行如下代码的话,又会发现不一样的情况:
最终结果是,128的两个变量结果是false,而127的两个变量的结果是true,这是为什么呢?
其实java中为了提高程序的执行效率,将[-128 ~ 127] 之间的多有的包装对象提前创建好了,放到了一个方法区的“整数型常量池”当中,目的是只要在这个区间的数据就不需要再new 对象了,直接冲整数型常量池当中取。
所以其实,变量x和变量y中保存的内存地址是一样的。具体可以参考如下视频中截图的内存地址:
String、int、Integer之间的相互转换
-
int → Integer:
-
Integer → int:
-
int → String:
-
String → int:
但是如果这个时候参数传入一个不是数字的字符串的话,同样会出现数字格式化异常: -
Integer → String:
-
String → Integer:
当然如果传入的字符串不是数字的话,也会有数字格式化异常发生。总结: