基本数据类型与包装类
外观
概述[编辑 | 编辑源代码]
Java的数据类型分为基本数据类型(Primitive Types)和引用类型(Reference Types)。其中,基本数据类型是语言内置的简单数据存储格式,而包装类(Wrapper Classes)则是将基本类型封装为对象的工具类,二者通过自动装箱/拆箱机制实现无缝转换。
核心区别[编辑 | 编辑源代码]
特性 | 基本数据类型 | 包装类 |
---|---|---|
存储方式 | 栈内存 | 堆内存 |
默认值 | 有(如int为0) | null |
是否对象 | 否 | 是(继承自Object) |
线程安全 | 不安全 | 部分安全(如AtomicInteger) |
基本数据类型[编辑 | 编辑源代码]
Java有8种基本数据类型:
数值型[编辑 | 编辑源代码]
- 整型:
byte
(8位,范围:到)short
(16位)int
(32位,默认整型)long
(64位,需加L
后缀)
- 浮点型:
float
(32位,需加F
后缀)double
(64位,默认浮点型)
非数值型[编辑 | 编辑源代码]
char
(16位Unicode)boolean
(true/false)
包装类[编辑 | 编辑源代码]
每个基本类型都有对应的包装类(位于java.lang
包):
基本类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
核心功能[编辑 | 编辑源代码]
- 提供类型转换方法(如
Integer.parseInt()
) - 实现对象化操作(如集合存储)
- 包含常量(如
Integer.MAX_VALUE
)
自动装箱与拆箱[编辑 | 编辑源代码]
自Java 5引入的自动转换机制:
- 装箱:基本类型 → 包装类对象(隐式调用
valueOf()
) - 拆箱:包装类对象 → 基本类型(隐式调用
xxxValue()
)
// 自动装箱示例
Integer obj = 42; // 编译器实际执行:Integer.valueOf(42)
// 自动拆箱示例
int num = obj; // 编译器实际执行:obj.intValue()
页面模块:Message box/ambox.css没有内容。
自动装箱可能引发NullPointerException: |
Integer nullObj = null;
int n = nullObj; // 运行时抛出NullPointerException
缓存机制[编辑 | 编辑源代码]
部分包装类会缓存常用值(享元模式):
Integer
缓存-128~127(可通过-XX:AutoBoxCacheMax
调整)Boolean
缓存TRUE/FALSECharacter
缓存0~127
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true(使用缓存对象)
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false(新建对象)
实际应用案例[编辑 | 编辑源代码]
场景1:集合操作[编辑 | 编辑源代码]
集合类(如ArrayList
)只能存储对象:
List<Integer> list = new ArrayList<>();
list.add(1); // 自动装箱
int val = list.get(0); // 自动拆箱
场景2:泛型编程[编辑 | 编辑源代码]
泛型类型参数必须是包装类:
class Box<T> {
private T value;
// 只能使用Integer而非int
}
场景3:数值比较[编辑 | 编辑源代码]
Integer x = 500;
Integer y = 500;
System.out.println(x.equals(y)); // true(值比较)
System.out.println(x == y); // false(对象地址比较)
最佳实践[编辑 | 编辑源代码]
1. 优先使用基本类型(内存高效)
2. 需要对象操作时使用包装类
3. 使用equals()
而非==
比较包装类
4. 注意自动拆箱时的NPE风险