目录
什么是包装类?
基本数据类型所对应的引用数据类型。
Object可统一所有数据,包装类的默认值是null。
八个基本类型所对应的包装类型
类型装换与装箱、拆箱。
八大基本类型是存储在栈中的,对象存在堆中,装箱就是指把栈中的基本类型保存到堆中,拆箱就是把堆中的对象保存到栈中。
也就是说,把基本类型转换成引用类型为装箱,引用类型转成基础类型为拆箱。
Number父类提供了6个共性方法。(拆箱)
装箱
接下来通过一些简单案例来理解装箱和拆箱。
jdk1.5以后自动装箱拆箱。
package com.zhang.baozhuang.Demo01;
public class Demo01 {
public static void main(String[] args) {
//装箱操作
//基本类型 num1
int num1 = 18;
//使用Integer类创建对象
Integer integer = num1;
Integer integer2 = num1;
System.out.println("装箱成功");
System.out.println(integer);
System.out.println(integer2);
//拆箱操作 引用类型装换成基本类型
int integer3 = 100;
int num2 = integer3;
System.out.println("拆箱成功");
System.out.println(integer3);
}
}
基本类型和字符串转换
基本类型转成字符串。
两种方法,其中可以用对数进行转化进制。radix填写要转换的进制,如下
字符串转成基本类型
其中有点需要注意 boolean字符串转成基本类型时,只有“true”会转换成true,其他全都转成false。
总代码
package com.zhang.baozhuang.Demo01;
public class Demo01 {
public static void main(String[] args) {
//装箱操作
//基本类型 num1
int num1 = 18;
//使用Integer类创建对象 两种方法
Integer integer = num1;
Integer integer2 = num1;
System.out.println("装箱成功");
System.out.println(integer);
System.out.println(integer2);
//拆箱操作 引用类型装换成基本类型
int integer3 = 100;
int num2 = integer3;
System.out.println("拆箱成功");
System.out.println(integer3);
System.out.println("++++++++++++++++++++++++++++++");
//基本类型和字符串之间转换。
//基本类型装换成字符串
//方法1 使用+号
int n1 = 109;
String s1 = n1+"";
//方法2 使用Intege中的toString()方法
String s2 = Integer.toString(n1);
System.out.println(s1);
System.out.println(s2);
//转换进制 16位
String s3 = Integer.toString(n1,16);
System.out.println(s3);
System.out.println("=======================");
//字符串转成基本类型。
String str = "150";
//使用Integer.parseXXX();
int n3 = Integer.parseInt(str);
System.out.println(n3);
//boolean字符串转成基本类型,"true"----->true 非"true"----->false
String str2 = "true";
String str3 = "SA";
boolean b1 = Boolean.parseBoolean(str2);
boolean b2 = Boolean.parseBoolean(str3);
System.out.println(b1);
System.out.println(b2);
}
}
整数缓冲区
Integer在运行时会产生一个缓冲区
缓冲区主要包括了256个常用的整数包装类对象。
来看个例子
package com.zhang.baozhuang.Demo01;
//缓冲区问题
public class Demo02 {
public static void main(String[] args) {
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1==integer2);
//自动装箱
Integer integer3 = 100;
Integer integer4 = 100;
System.out.println(integer3==integer4);
Integer integer5 = 200;
Integer integer6 = 200;
System.out.println(integer5==integer6);
}
}
integer1和integer2对比结果是false很好理解,i1和i2都指向堆里的一个对象,他们的地址不一样。
但是i3和i4,i5和i6都同样是自动装箱,为什么一个是true一个是false呢?
这就涉及到缓冲区了,首先我们要知道自动装箱是调用了valueOf,所有代码相当于
然后我们进带valueOf方法中去看看。
-128到128就是缓冲区,是一个数组,如果数在这个区间,就从缓冲区这个数组中取这个对象,如果数不在这个区间,那么就new一个对象给它。
所以i3、i4取的是用一个对象,地址相同,所以是true。
i5和i6是200,不在这个数组中,他们取的是新建的两个不同对象,地址不同,所以是false。