在Java中,数据类型分为基本类型(Primitive Types)和引用类型(Reference Types),它们在存储方式、行为特性和内存管理上有本质区别。
一、基本类型(Primitive Types)
Java定义了 8种基本类型,直接存储数据值:
|
类型 |
大小 |
默认值 |
取值范围/说明 |
|
|
8位(1字节) |
|
-128 ~ 127 |
|
|
16位(2字节) |
|
-32,768 ~ 32,767 |
|
|
32位(4字节) |
|
-2³¹ ~ 2³¹-1(约±21亿) |
|
|
64位(8字节) |
|
-2⁶³ ~ 2⁶³-1 |
|
|
32位(4字节) |
|
单精度浮点数(精度约6-7位小数) |
|
|
64位(8字节) |
|
双精度浮点数(精度约15位小数) |
|
|
16位(2字节) |
|
Unicode字符(0 ~ 65,535) |
|
|
未明确定义 |
|
仅 |
二、引用类型(Reference Types)
存储的是对象的内存地址(引用),而非数据本身。所有引用类型都继承自java.lang.Object。常见类型包括:
- 类(Class):如
String、自定义类Person等。 - 接口(Interface):如
List、Runnable。 - 数组(Array):如
int[]、String[]。 - 枚举(Enum):如
enum Season { SPRING, SUMMER }。 - 注解(Annotation):如
@Override。
三、核心区别
|
特性 |
基本类型 |
引用类型 |
|
存储内容 |
直接存储数据值(如 |
存储对象的内存地址(如 |
|
内存分配 |
栈内存(Stack) |
变量在栈,对象在堆(Heap) |
|
默认值 |
有默认值(如 |
默认为 |
|
参数传递 |
按值传递(复制值) |
按引用传递(复制地址,共享对象) |
|
内存占用 |
固定大小(如 |
变量固定大小(通常4/8字节),对象大小不固定 |
|
垃圾回收 |
不受GC管理 |
由GC自动回收未引用的对象 |
|
操作方式 |
直接操作值 |
通过引用操作对象(调用方法等) |
|
空值 |
不能为 |
可以为 |
四、关键示例
1. 赋值与修改
// 基本类型(值独立)
int x = 10;
int y = x; // y=10(复制值)
y = 20; // x仍为10,y变为20
// 引用类型(共享对象)
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // arr2与arr1指向同一数组
arr2[0] = 100; // arr1[0]也变为100
2. 方法参数传递
void modify(int num, int[] array) {
num = 100; // 不影响原始值(基本类型复制)
array[0] = 100; // 修改原始对象(引用类型共享)
}
int val = 50;
int[] arr = {1, 2};
modify(val, arr); // val仍为50,arr变为{100, 2}
3. 空值(Null)
int num = null; // 编译错误!基本类型不能为null
String str = null; // 合法,但调用str.length()会抛出NullPointerException
五、特殊机制:包装类(Wrapper Classes)
为每个基本类型提供对应的引用类型(如 int → Integer),用于泛型、集合等场景:
List<Integer> list = new ArrayList<>(); // 集合只能存引用类型
list.add(10); // 自动装箱(int → Integer)
int num = list.get(0); // 自动拆箱(Integer → int)
总结
- 基本类型:高效、轻量,适合数值计算。
- 引用类型:功能强大,支持面向对象特性(封装、继承、多态),但涉及堆内存和GC开销。
理解二者区别是避免内存泄漏、空指针异常(如NullPointerException)和性能问题的关键。
1186

被折叠的 条评论
为什么被折叠?



