Java存储返回数组疑问:小容量数组为何可接收大容量返回数组
Java数组赋值后长度变化的原因
先看你的代码:
import java.io.*; class test { int[] returnArray() { int[] arr={1,2,3,4,5,6,7,8,9,10}; return arr; } void display(int[] arr) { for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+"\t"); } } public static void main(String[] args) { test obj=new test(); int[] arr=new int[1]; arr=obj.returnArray(); obj.display(arr); } }
核心原因是Java中的数组是引用类型,数组变量存储的不是数组元素本身,而是指向堆内存中数组对象的地址。具体过程:
- 执行
int[] arr=new int[1];时,JVM在堆中创建了一个长度为1的数组对象,变量arr保存的是这个对象的内存地址。 - 执行
arr=obj.returnArray();时,returnArray()方法返回的是一个长度为10的数组对象的地址,这个地址会覆盖变量arr原来保存的地址。此时,原来那个长度为1的数组对象因为没有任何引用指向它,会被垃圾回收器自动清理。 - 调用
display(arr)时,arr指向的已经是那个长度为10的数组对象,所以遍历打印时能输出全部10个元素,不会出现越界错误。
你之前的误解在于以为是把长数组的元素塞进短数组里,但实际上只是让数组变量换了一个指向的对象——数组的长度是创建时固定的,无法修改,但变量可以指向不同的数组对象。
内容的提问来源于stack exchange,提问作者Spencer
相关产品推荐
相关产品推荐

