常用类-包装类
包装类
概念
-
官方文档的
java.lang包中可查看 -
基本数据类型所对应的引用数据类型
-
Object可统一所有类,包装类的默认值为Null -
对应关系
![]()
-
基本数据类型无方法可用,想使用方法需转换成包装类型,下图为官方文档中的
Byte类的部分方法![]()
类型转换与装箱、拆箱
概念
-
基本数据类型存储在栈空间中
-
引用类型数据存储在堆空间中
-
装箱、拆箱就是类型转换
-
装箱就是将基本类型转换成引用类型的过程(基本类型转换成包装类)
-
拆箱就是将引用类型转换成基本类型的过程(包装类转换成基本类)
-
八种包装类提供不同类型间的转换方式
-
Number父类中提供六种共性方法![]()
-
parseXXX()静态方法,引用类型转换为基本类型 -
valueOf()静态方法,基本类型转换为引用类型
-
-
注意:需保证类型兼容,否则抛出异常
String str = "12a"; int i3 = Integer.parseInt(str);异常:
Exception in thread "main" java.lang.NumberFormatException: For input string: "12a"
int、Integer的转换
-
Integer的相关方法- 构造方法
![]()
- valueOf(int i)方法
![]()
- intValue()
![]()
-
装箱
//装箱:转换成包装类 //基本数据类型 int num1 = 1; //创建Integer类进行转换 //1.用构造方法 Integer integer1 = new Integer(num1); //2.valueOf()方法 Integer integer2 = valueOf(num1); -
拆箱
//拆箱:转换成包装类 //创建Integer实例 Integer integer3 = new Integer(2); //intValue()方法 int num2 = integer3.intValue(); -
JDK1.5之后提供自动装箱和拆箱
//基本数据类型 int num1 = 1; //自动装箱 Integer integer4 = num1; //自动拆箱 int num4 = integer4;
基本类型和字符串之间的转换
-
基本类型转成String
//1.基本类型转换成String int num = 10; //1.1 加"" String s1 = num+""; //1.2 静态方法valueOf() String s2 = valueOf(num); //1.3 Integer的toString() Integer i1 = new Integer(num); String s3 = i1.toString(); -
String转换成基本类型
//2.String转换成基本类型 String str = "12"; //2.1静态方法parseXXX() int i2 = parseInt(str); //2.2Integer的parseInt int i3 = Integer.parseInt(str); -
boolean的特殊情况
//3.注意boolean字符串形式转成基本类型,"true"-->true,非"true"-->false String str1 = "true"; String str2 = "yes"; String str3 = "false"; //用Boolean的parseBoolean方法 boolean b1 = Boolean.parseBoolean(str1); boolean b2 = Boolean.parseBoolean(str2); boolean b3 = Boolean.parseBoolean(str3); System.out.println(b1);//输出为true System.out.println(b2);//输出为false System.out.println(b3);//输出为false
整数缓冲区
概述
-
Java预先创建了256个常用的证书包装类对象
-
在实际应用中对已创建的对象进行复用
面试题
-
代码
//面试题,判断值相同的两个Integer实例是否相等 //1.通过new Integer对象 Integer integer1 = new Integer(100); Integer integer2 = new Integer(100); System.out.println(integer1 == integer2);//输出为false //2.自动装箱,值为100 Integer integer3 = 100; Integer integer4 = 100; System.out.println(integer3 == integer4);//输出为true //3.自动装箱,值为200 Integer integer5 = 200; Integer integer6 = 200; System.out.println(integer5 == integer6);//输出为false -
分析
-
将.class文件反编译(拖入XJad中),发现自动装箱使用的是
valueOf()方法![]()
-
查看
Integer的valueOf()源码public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }发现
Integer存在缓冲区(以数组的形式存在于堆中),大于low、小于high的数直接返回缓冲区中的值,否则才创建新对象 -
进一步查看源码
![]()
low=-128,high=127,即Integer缓冲区包括大于-129,小于128的256个数,在这个范围内的数值相同时,引用地址也相同 -
题目解析
-
1.通过
new Integer创建了两个实例,实质是在堆空间中开辟了两个空间,在栈空间中的引用指向不同地址,所以两个对象不相等,返回false -
2.通过自动装箱即
valueOf()方法,值为100,此时因为100处于整数缓冲区内,直接返回缓冲区中的地址,integer3与integer4的引用地址相同,所用相等![]()
-
3.通过自动装箱即
valueOf()方法,值为200,此时因为200不在整数缓冲区内,所以要新建两个对象,在堆中开辟两个空间,所以引用地址不同,两个值不相等
-
-









浙公网安备 33010602011771号