包装类(Wrapper)
1. 介绍
-
(1)针对八种基本数据类型相应的引用类型 --> 包装类
-
2. 分类和继承关系
基本数据类型 | 包装类 | 父类 |
---|
boolean | Boolean | Object |
char | Character | Object |
byte | Byte | Number |
short | Short | Number |
int | Integer | Number |
long | Long | Number |
float | Float | Number |
double | Double | Number |



一、包装类和基本数据类型的相互转换(装箱和拆箱)
(1)jdk5 前的手动装箱和拆箱方式, 装箱:基本类型->包装类型,反之,拆箱
(2)jdk5 以后(含 jdk5)的自动装箱和拆箱方式
(3)底层调用的方法
(4)下面以Integer
举例,其他包装类的方法类似,不一一举例
1. 装箱(int
--> Integer
)
int n = 10;
Integer integer = Integer.valueOf(n);
Integer integer1 = new Integer(n);
2. 拆箱(Integer
--> int
)
int n = 10;
Integer integer = Integer.valueOf(n);
int n1 = integer.intValue();
3. 自动装箱和插箱
int n = 10;
Integer integer = n;
int n1 = integer;
实现自动的原理:在底层会调用相应的方法
二、包装类和String 类的相互转换
1. Integer
--> String
的三种方法
-
(1)使用字符串串拼接
-
-
(3)使用String.valueOf()
方法
-
String.valueOf()
方法在底层接收的是一个对象,而Integer
刚好就是一个对象
代码示例
Integer integer = 5;
String str1 = integer + "";
String str2 = integer.toString();
String str3 = String.valueOf(integer);
2. String
--> Integer
两种方法
-
(1)使用Integer.parseInt()
方法(自动装箱)
-
解读:parseInt()
方法返回int
类型,本质还是把int
类型赋值给Integer
类型,实现了自动装箱
-
代码示例
String str = "123";Integer integer1 = Integer.parseInt(str); Integer integer2 = new Integer(str);
三、Integer
类和Character
类的一些常用方法
说明:下面举例说明,对于其他类型的大同小异
方法 | 描述 |
---|
Integer.MIN_VALUE | 返回整数的最小值 |
Integer.MAX_VALUE | 返回整数的最大值 |
Character.isDigit(char) | 判断字符是否为数字 |
Character.isLetter(char) | 判断字符是否为字母 |
Character.isUpperCase(char) | 判断字符是否为大写字母 |
Character.isLowerCase(char) | 判断字符是否为小写字母 |
Character.isWhitespace(char) | 判断字符是否为空格 |
Character.toUpperCase(char) | 将字符转换为大写字母 |
Character.toLowerCase(char) | 将字符转换为小写字母 |
代码示例
public class Test {public static void main(String[] args) {System.out.println(Integer.MIN_VALUE); System.out.println(Integer.MAX_VALUE); System.out.println(Character.isDigit('a')); System.out.println(Character.isLetter('a')); System.out.println(Character.isUpperCase('a')); System.out.println(Character.isLowerCase('a')); System.out.println(Character.isWhitespace('a')); System.out.println(Character.toUpperCase('a')); System.out.println(Character.toLowerCase('A')); }
}
-2147483648
2147483647
false
true
false
true
false
A
a
四、Integer
的创建机制底层源码探究
源码如下
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
继续追源码,可以得到:low:-127、high:128
int
--> Integer
底层机制的解释
-
(1)值在 -128 --> 127
范围内会使用缓存池,当两个 Integer 对象的值在这个范围内时,它们会引用相同的缓存对象(存储在Cache
数组中)
-
代码示例
(1)数据在范围内:引用相同的缓存对象
Integer integer1 = 1;
Integer integer2 = 1;
System.out.println(integer1 == integer2);
true
(2)数据不再范围内:创建Integer
对象
Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2);
false
五、题目练习
1. 易错题
(1)第一题
Object obj1 = true ? new Integer(1) : new Double(2.0);
System.out.println(obj1);
输出:1.0
解释:三元运算符看成一个整体,double
的优先级最高,所以输出double
(遵循自动类型转换中的自动提升原则)
自动提升原则:表达式结果的类型自动提升为操作数中最大的类型
int result = true ? 1 : 2.5;
System.out.println(result);
输出:1.0
(2)第二题
Object obj2;
if (true) {obj2 = new Integer(1);
} else {obj2 = new Double(2.0);
}
System.out.println(obj2);
输出:1
2. 综合题


答案

总结
(1)如果是在范围内:是同一个对象
(2)如果超出范围或者new
:只要是创建了对象就不是同一个对象
(3)int
和Integer
:只要有基本数据类型,判断的是值是否相等