什么是包装类
在Java中,包装类(Wrapper Class)是为基本数据类型提供的对应的引用类型。Java中的基本数据类型(如int、char、boolean等)不是对象,为了在需要对象的场景中使用基本数据类型(如集合框架、泛型等),Java提供了包装类。
每种基本数据类型都有对应的包装类:
- byte → Byte
- short → Short
- int → Integer
- long → Long
- float → Float
- double → Double
- char → Character
- boolean → Boolean
包装类可以将基本数据类型的值包装为对象,同时提供了许多用于操作基本数据类型的方法。
包装类是值类型还是引用类型,使用=会改变原来的对象吗?
-
包装类是引用类型:所有包装类都是java.lang包下的类,它们创建的实例都是对象,因此属于引用类型。
-
使用=不会改变原来的对象:当使用
=
为包装类变量赋值时,实际上是将引用指向了新的对象,而不是修改原来的对象。因为包装类是不可变的(immutable),它们的内部值一旦创建就无法修改。
示例:
Integer a = new Integer(10);
Integer b = a;
b = new Integer(20);
// 此时a仍然是10,b是20,a的值没有被改变
包装类的缓存机制
Java中部分包装类提供了缓存机制,对一定范围内的值进行缓存,以提高性能和减少内存占用。当使用自动装箱或valueOf()方法创建对象时,会优先使用缓存中的对象。
包装类 | 缓存范围 | 缓存机制说明 |
---|---|---|
Byte | -128 ~ 127 | 全部缓存,范围内的值会复用同一个对象 |
Short | -128 ~ 127 | 固定范围缓存,超出范围会创建新对象 |
Integer | -128 ~ 127 | 默认范围缓存,可通过JVM参数调整上限 |
Long | -128 ~ 127 | 固定范围缓存,与Short相同 |
Character | 0 ~ 127 | 缓存ASCII字符范围内的字符 |
Float | 无缓存 | 没有实现缓存机制 |
Double | 无缓存 | 没有实现缓存机制 |
Boolean | true和false | 只缓存两个静态实例:TRUE和FALSE |
缓存机制示例:
Integer i1 = 100; // 自动装箱,使用缓存
Integer i2 = 100;
System.out.println(i1 == i2); // true,指向同一个缓存对象Integer i3 = 200; // 超出缓存范围
Integer i4 = 200;
System.out.println(i3 == i4); // false,指向不同对象