Java数组是引用类型,但元素类型决定赋值行为:基本类型数组元素独立,修改互不影响;引用类型数组元素为对象地址,共享对象时修改会影响所有引用。

Java 中数组本身是引用类型,但数组元素可以是基本类型或引用类型——这直接导致赋值行为出现关键差异:基本类型数组赋值后修改元素互不影响;引用类型数组赋值后多个变量可能共享同一组对象,改一个就全变。
内存布局决定赋值本质
基本类型数组(如 int[])在堆中连续存放实际数值,赋值时只是把数组对象的引用拷贝一份;引用类型数组(如 String[])在堆中存的是一串地址,每个地址指向另一个堆对象。
- int[] a = {1, 2, 3}; int[] b = a; → a 和 b 指向同一个数组对象,但数组里存的是实实在在的数字
- String[] x = {"a", "b"}; String[] y = x; → x 和 y 指向同一个数组对象,而数组里每个位置只存字符串对象的地址
修改元素时的影响范围不同
对数组元素赋值,效果取决于元素类型是基本还是引用:
- 基本类型数组:修改 b[0] = 99,只改 b 所指数组里的值,a[0] 不变(因为元素是独立的值)
- 引用类型数组:修改 y[0] = "z",y[0] 指向新字符串,x[0] 仍指向原字符串(这是重新赋值引用);但若执行 y[0].append("x")(假设是 StringBuilder),x[0] 也会同步变化(因为共用同一对象)
初始化与默认值体现底层逻辑
数组创建时自动初始化所有元素,但默认值由元素类型决定:
立即学习“Java免费学习笔记(深入)”;
- 基本类型数组:int[] arr = new int[3]; → 元素为 0, 0, 0
- 引用类型数组:String[] arr = new String[3]; → 元素为 null, null, null
这个区别正源于基本类型必须有确定值,而引用类型本质是“可能为空的地址”。
泛型和集合操作不兼容基本类型数组
基本类型数组无法直接用于泛型容器,比如 List<int> 编译报错;必须用包装类数组(如 Integer[])才能放进 List<Integer>。
- int[] nums = {1, 2}; → 不能直接转成 Arrays.asList(nums)(结果是含一个 int[] 元素的列表)
- Integer[] nums = {1, 2}; → Arrays.asList(nums) 正确返回含两个 Integer 的列表


















