1️⃣学习目标
- 什么是包装类?
- 包装类与基本数据类型之间的对应关系
- 包装类的常用方法
2️⃣基本数据类型
Java中的包装类包括Integer、Long、Short 、Byte、Character、Double、Float、Boolean、BigInteger、BigDecimal 。其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算, BigInteger 支持任意精度的整数, BigDecimal支持任意精度带小数点的运算。
包装类为了解决以下基本数据类型遇到的问题:
- 不能像对象一样拥有属性和方法。
- 无法进行对象化交互
基本类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
3️⃣包装类特点
- 所有的包装类都被Final修饰,说明包装类不能被继承且没有子类的。
- 数值型包装类继承自Number类,字符型和布尔型则继承自Object类。
4️⃣装箱和拆箱
- 手动装箱、拆箱
public class TestNumber {
public static void main(String[] args) {
int i = 5;
//基本类型转换成封装类型
Integer it = new Integer(i);
//封装类型转换成基本类型
int i2 = it.intValue();
}
}
- 自动装箱、拆箱
public class TestNumber {
public static void main(String[] args) {
int i = 5;
//自动转换就叫装箱
Integer it2 = i;
//自动转换就叫拆箱
int i3 = it;
}
}
- byte和Integer之间不能进行自动拆箱和自动装箱
public class NumberTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
byte b = 1;
//byte和Integer之间能否进行自动拆箱和自动装箱
Integer i1 = b; // 不能把byte直接自动装箱成Integer
b = new Integer(1); // 也不能把Integer自动拆箱成 byte
}
}
- 基本数据类型转化为字符串
public class NumberTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 1;
// 基本数据类型转换为字符串
Integer b = a;
String c = Integer.toString(b);
System.out.println("转化后的字符串是"+c+",它来自" + c.getClass()+"类");
}
}
- 字符串类型转换为基本数据类型
public class NumberTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "1";
String b ="22";
// 字符串转化为基本数据类型
//1,包装类parse
int d = Integer.parseInt(a);
System.out.println("String类型转化Int类型d="+d);
//2.包装类中的valueOf, 先把包装类转化成为包装类让后再拆箱
int c = Integer.valueOf(b);
System.out.println("String类型转化Int类型c="+c);
}
}
5️⃣基本类型与包装类的异同
- 在 Java 中,一切皆对象,但八大基本类型却不是对象。
- 声明方式的不同,基本类型无需通过 new 关键字来创建,而 包装 类型 需 new 关键字
- 存储方式及位置的不同,基本类型 是直接存储变量的值保存在 栈中能高 效的存取, 包装 类型 需要通过引用指向实例,具体的实例保存在堆中。
- 初始值的不同, 包装 类型 的初始值为 null ,基本类型的的初始值视具体 的类型而定,比如 int 类型的初始值为 0
boolean 类型为 false 。 - 使用方式的不同,比如与集合类合作使用时只能使用包装类 型
6️⃣包装类缓冲区(对象池)
public class WrapperTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer one=new Integer(100);
Integer two=new Integer(100);
System.out.println("one==two的结果:"+(one==two));//1
Integer three=100;//自动装箱
//Integer three=Integer.valueOf(100);
System.out.println("three==100的结果:"+(three==100));//2 自动拆箱
//Integer four=100;
Integer four=Integer.valueOf(100);
System.out.println("three==four的结果:"+(three==four));//3
Integer five=200;
System.out.println("five==200的结果:"+(five==200));//4
Integer six=200;
System.out.println("five==six的结果:"+(five==six));//5
Double d1=Double.valueOf(100);
System.out.println("d1==100的结果:"+(d1==100));
Double d2=Double.valueOf(100);
System.out.println("d1==d2的结果:"+(d1==d2));
}
}
执行结果如下
思考:
上面代码中中"three==four"为什么会返回true?而"five==six" 以及"d1==d2" 返回的却是false。
答案:
- 调用valueOf(),Java为了提高效率,在这个方法执行过程中提供了对象池,如果参数在-128 ~ 127之间就可以装进这个对象池。
- 当给包装类赋值时,它会在对象池里先查找是否存在这样的一个对象,如果有,就会从对象池里直接产生,让现在这个对象也指向这个内存空间,如果没有,就会隐式地调用new关键字来实例化一个对象。
- 可以使用对象池的包装类有 Integer:Long、Short 、Byte、Character、Boolean。