Java中的包装类
目录
为什么要有包装类
包装类的作用
基本数据类型和包装类的对应关系
包装类的核心功能
装箱(Boxing)和拆箱(Unboxing)
装箱:
拆箱:
类型转换
字符串<----->基本类型
进制转换
自动装箱与拆箱(Autoboxing)
128陷阱
为什么要有包装类
Java是面向对象编程的,但是基本类型却没有对象,这就会产生矛盾,于是包装类为了解决这一问题应运而生。
包装类的作用
-
让基本类型具备对象的特性
可以参与面向对象的操作(如存入List
、作为方法参数传递) -
提供丰富的工具方法
类型转换、进制转换、最大值/最小值常量等 -
支持泛型
泛型只能使用对象(如List<Integer>
,不能是List<int>
)
基本数据类型和包装类的对应关系
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
包装类的核心功能
装箱(Boxing)和拆箱(Unboxing)
装箱:
基本类型----->包装类对象
Integer num = Integer.valueOf(10); // 手动装箱(推荐)
Integer num2 = 10; // 自动装箱(Java 5+)
拆箱:
包装类对象------>基本类型
int n = num.intValue(); // 手动拆箱
int n2 = num; // 自动拆箱
类型转换
字符串<----->基本类型
int num = Integer.parseInt("123"); // 字符串 → int
String s = Integer.toString(123); // int → 字符串
double d = Double.parseDouble("3.14"); // 字符串 → double
进制转换
String binary = Integer.toBinaryString(10); // 10 → "1010"(二进制)
String hex = Integer.toHexString(255); // 255 → "ff"(十六进制)
自动装箱与拆箱(Autoboxing)
// 自动装箱(编译后实际调用 Integer.valueOf(10))
Integer num = 10; // 自动拆箱(编译后实际调用 num.intValue())
int n = num;
128陷阱
Integer num1=100;
Integer num2=100;
System.out.println(num1 == num2); Integer num3=200;
Integer num4=200;
System.out.println(num3 == num4);
大家到文章底部猜一下两个输出分别是什么
答案:
truefalse
原因:因为Integer在编译时,会变为 Integer.valueof(),我们看该方法的原码,会发现其是用一个cache数组来存储数据的,如下:
而对于cache数组,我们查看其源码:
发现其大小是-128~127,也就是说,当Integer的值是出于-128~127之间时,会直接使用cache数组中已经存储好的值,再看valueof的原码,当数据是在这个范围外时,就会在堆内存中新开辟一个Integer的空间,所以此时num3==num4的值为false
小练习
接下来我们可以继续通过练习来掌握
public static void main(String[] args) {int a = 10;int b = 10;Integer a1 = 10;Integer b1 = 10;Integer a2 = new Integer(10);Integer b2 = new Integer( 10);System.out.println(a == b); //trueSystem.out.println(a1==b1); //true,Integer的值在-128~127之间,所以此时用的是cache数组中的值,所以trueSystem.out.println(a2== b2); //false,a2和b2都是新开辟的Integer对象,所以地址不同,所以falseSystem.out.println(a1 == a); //true,当包装类用==与基本数据类型比较时,会自动拆箱 System.out.println(a1.equals(a)); //true,此时会自动装箱,与上一个情况类似System.out.println(a1 == a2); //false,地址不同,a2是新开辟的,a1是cache数组中的System.out.println(a == a2); //自动拆箱}
总结
特性 | 说明 |
---|---|
基本类型转对象 | 使用 valueOf() 或自动装箱 |
对象转基本类型 | 使用 xxxValue() 或自动拆箱 |
类型转换 | parseXxx() 将字符串转为基本类型,toString() 反之 |
128陷阱 | == 比较范围受限(-128~127) |