Java一维数组本身均为引用类型,存于堆中,变量名在栈中保存地址;基本类型数组在堆中连续存储数值,引用类型数组只存对象地址,元素初始化分别为零值和null,赋值时分别对应值拷贝和引用拷贝。

Java一维数组无论元素是基本类型还是引用类型,数组本身都是引用类型,存于堆中,变量名在栈中保存地址。真正关键差异在于:数组内部怎么存——是直接放数值,还是只放对象地址。
内存布局:连续值 vs 分散地址
基本类型数组(如int[])在堆中分配一块连续内存,每个元素就是真实数值。比如int[] arr = new int[3],JVM直接划出12字节(3×4),填入0, 0, 0。
引用类型数组(如String[])在堆中只分配“指针槽”,每个槽占8字节(64位JVM),初始全为null。实际字符串对象另存别处,数组里只记它们的地址。
- int[] a = {1, 2, 3} → 堆中:[1][2][3](紧挨着)
- String[] b = {"x", "y"} → 堆中:[addr1][addr2],而" x"和"y"各自在堆其他位置
初始化与默认值:零值 vs null
数组创建时自动初始化所有元素,但规则不同:
立即学习“Java免费学习笔记(深入)”;
- 基本类型数组按类型赋予“零值”:int→0,double→0.0,boolean→false,char→'\u0000'
- 引用类型数组统一赋
null,不代表对象存在,只是“还没指向谁”
所以String[] s = new String[2]后,s[0] == null为true;而int[] i = new int[2]后,i[0] == 0为true——不能混用判空逻辑。
赋值与修改:改自己 vs 改共享对象
对数组元素赋值时,行为取决于元素类型:
- 基本类型元素赋值是值拷贝:
int[] a = {1}; int[] b = a; b[0] = 99;→ a[0]仍是1 - 引用类型元素赋值是引用拷贝:
String[] x = {"a"}; String[] y = x; y[0] = "b";→ x[0]也变成"b"(因为x[0]和y[0]原本指向同一个String对象) - 注意:若元素是可变对象(如
StringBuilder[]),修改对象内容(如y[0].append("!"))同样影响x[0]
泛型与集合操作:包装类绕不开
Java泛型不接受基本类型,所以List<int></int>非法。要让基本类型进集合或泛型方法,必须用包装类:
- 不能直接传
int[]给Arrays.asList()生成List<integer></integer>(它会把整个数组当一个元素) - 正确做法是用
Integer[],或借助IntStream.of(arr).boxed().collect(...) - 而
String[]可直接用于Arrays.asList(),返回真正的List<string></string>
不复杂但容易忽略


















