Java包装类(Wrapper Classes)是Java提供的一种特殊类,用于将基本数据类型(primitive data types)转换为对象(objects)。
为什么要有包装类
序号 | 描述 | |
1 | 集合中使用基本数据类型 | Java集合类(如ArrayList、HashSet等)只能存储对象,而不能直接存储基本数据类型。通过使用包装类,我们可以将基本数据类型转换为对象,从而可以在集合中使用它们。 |
2 | 提供额外的功能 | 包装类不仅允许我们在集合中使用基本数据类型,还提供了一些额外的功能和方法。例如,Integer类提供了将整数转换为二进制字符串的toBinaryString()方法。 |
3 | 自动装箱和拆箱 | 从Java 5开始,引入了自动装箱(autoboxing)和拆箱(unboxing)的概念。这意味着在需要时,Java会自动将基本数据类型转换为包装类对象(自动装箱),反之亦然(自动拆箱)。 |
Java提供了与八种基本数据类型对应的包装类:
基本类型 | 包装类 |
byte | java.lang.Byte |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
char | java.lang.Character |
boolean | java.lang.Boolean |
创建包装类对象
Integer intObj = new Integer(10); // 使用构造函数创建对象
Integer intObj2 = Integer.valueOf(20); // 使用静态方法valueOf创建对象
自动装箱和拆箱
int primitiveInt = 10;
Integer wrapperInt = primitiveInt; // 自动装箱
int unwrappedInt = wrapperInt; // 自动拆箱
包装类的常用方法
Integer num = 123;
String binaryString = num.toBinaryString(); // 将整数转换为二进制字符串
boolean isEven = num.bitCount() % 2 == 0; // 使用bitCount方法判断是否为偶数(假设正整数)
缓存机制(以Integer为例)
对于Integer包装类,Java提供了一个特殊的缓存机制:对于值在-128到127之间的整数,Java会缓存这些对象,因此当你创建这些范围内的Integer对象时,实际上会得到缓存中的对象,而不是创建新的对象。
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // 输出 true,因为两个引用指向同一个对象
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // 输出 false,因为超过了缓存范围,创建了两个不同的对象
包装类用途总结
- 提供基本类型与对象之间的桥梁,因为Java中的集合类(如List、Set、Map等)只能存储对象,不能直接存储基本类型的数据,因此需要将基本类型包装为对象才能放入集合中。
- 提供了一些基本类型不具备的方法,例如比较大小、进制转换、字符串转换等。
- 支持自动装箱(Autoboxing)和拆箱(Unboxing)功能。自Java 5.0开始,编译器会自动在基本类型与它们的包装类之间进行转换。
- 包装类内部维护了缓存机制,例如对于Integer,在-128至127之间的小整数值,会共享相同的对象实例,以提高性能和减少内存消耗。
总结
Java包装类为基本数据类型提供了对象包装,使得基本数据类型可以在需要对象的场合(如集合)中使用,并提供了额外的功能。同时,自动装箱和拆箱机制简化了基本数据类型和包装类之间的转换过程。