java数组是引用类型,基本类型数组元素存值,引用类型数组元素存地址;初始化时基本类型赋零值,引用类型赋null;赋值时基本类型值拷贝,引用类型地址拷贝;泛型要求引用类型,基本类型需包装类。

Java 数组本身是引用类型,但数组元素可以是基本类型(如 int)或引用类型(如 String),二者在内存中如何存放、初始化、赋值和使用,决定了实际编码中的行为差异。理解这个机制,能避开空指针、意外共享、泛型报错等常见问题。
内存布局:值存哪儿,地址存哪儿
基本类型数组(如 int[] arr = new int[3])在堆中分配一块连续内存,每个位置直接存数值(例如 0、0、0),共占 12 字节(3×4)。整个数组是一个对象,变量 arr 在栈中只保存这个对象的地址。
引用类型数组(如 String[] arr = new String[3])也在堆中分配连续空间,但每个位置只存 8 字节的引用(64 位 JVM),初始全为 null;真正的字符串对象(如 new String("hello"))单独存在堆其他位置,数组里只记它们的“门牌号”。
初始化与默认值:零值 vs null
数组创建时,所有元素自动初始化:
-
基本类型数组按类型填零值:
boolean[]→false,double[]→0.0,char[]→'\u0000' -
引用类型数组统一为
null:Object[]、List[]、MyClass[]所有元素初始都不可用,访问前必须显式赋值,否则触发NullPointerException
赋值与修改:值拷贝 vs 引用共享
对数组元素赋值时,行为取决于元素类型:
- 给
int[]元素赋值(如a[0] = 5)是写入真实数值,不影响其他变量 - 给
String[]元素赋值(如s[0] = "x")是写入新地址,若原位置指向某个可变对象(如StringBuilder),多个数组引用它时,修改其内容会影响所有持有该引用的变量 - 数组变量之间赋值(如
b = a)永远是引用拷贝——无论元素是基本还是引用类型,a和b指向同一块堆内存,改长度或元素都会互相可见
泛型与实际使用:包装类绕不开
Java 泛型不接受基本类型,所以 List<int></int> 非法,必须用 List<integer></integer>。同理,想把基本类型数组传给泛型方法或集合,得先转成包装类数组(如 Integer[]),或用 Arrays.asList() 配合自动装箱。
而引用类型数组天然兼容泛型:String[] 可直接转为 List<string></string>,File[] 可放进 Collection<file></file>,无需额外转换。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











