黑马程序员技术交流社区

标题: java数组内存分配机制问题 [打印本页]

作者: zhanghuxin    时间: 2013-11-14 21:01
标题: java数组内存分配机制问题
import java.util.*;

public class ObjectArrayTest
{
        public static void main(String[] args)
        {
                //定义、并初始化一个Object数组
                Object[] objArr = new Object[3];
                //让objArr所引用数组的第二个元素再次指向一个长度为2的Object[]数组
                objArr[1] = new Object[2];
                //将objArr[1]的值赋给objArr2,即让objArr2和objArr[1]指向同一个数组对象
                Object[] objArr2 = (Object[])objArr[1];
                //让objArr2所引用数组的第二个元素再次指向一个长度为3的Object[]数组
                objArr2[1] = new Object[3];
                //将objArr2[1]的值赋给objArr3,即让objArr3和objArr2[1]指向同一个数组对象
                Object[] objArr3 = (Object[])objArr2[1];
                //让objArr2所引用数组的第二个元素再次指向一个长度为3的int[]数组
                objArr3[1] = new int[5];
                ////将objArr3[1]的值赋给iArr,即让iArr和objArr3[1]指向同一个数组对象
                int[] iArr = (int[])objArr3[1];
                //依次为iArr数组的每个元素赋值
                for (int i = 0 ; i < iArr.length ; i++ )
                {
                        iArr[i] = i * 3 + 1;
                }
                //直接通过objArr访问iArr数组的第3个元素
                System.out.println( ((int[])((Object[])((Object[])objArr[1])[1])[1])[2] );
        }
}
想问一下,大家对这个程序数组在内存中的分配机制是咋理解,我看了好久,不明白!!
作者: smileven    时间: 2013-11-14 22:02
(1)//定义、并初始化一个Object数组
     Object[] objArr = new Object[3];
=>内存中有了:objArr[0],objArr[1],objArr[2];

(2)//让objArr所引用数组的第二个元素再次指向一个长度为2的Object[]数组
     objArr[1] = new Object[2];
=>内存中的objArr[1]指向了一个Object对象数组
      objArr[0]
      objArr[1]<---objArr[1][0],objArr[1][1]
      objArr[2]

(3)//将objArr[1]的值赋给objArr2,即让objArr2和objArr[1]指向同一个数组对象
     Object[] objArr2 = (Object[])objArr[1];
=>
      objArr[1](objArr2)<--|objArr[1][0],objArr[1][1]                        
            objArr2<----------|
这时的objArr[1][0],objArr[1][1]也就是objArr2[0],objArr2[1]

(4)//让objArr2所引用数组的第二个元素再次指向一个长度为3的Object[]数组
     objArr2[1] = new Object[3];

=>objArr2[1]<-------------objArr2[1][0],objArr2[1][1],objArr2[1][2],

(5)//将objArr2[1]的值赋给objArr3,即让objArr3和objArr2[1]指向同一个数组对象
     Object[] objArr3 = (Object[])objArr2[1];

=>objArr2[1]<-------------|objArr2[1][0],objArr2[1][1],objArr2[1][2],
        objArr3<--------------|
这时的objArr2[1][0],objArr2[1][1],objArr2[1][2]也就是objArr3[0],objArr3[1],objArr3[2],

(6)//让objArr2所引用数组的第二个元素再次指向一个长度为3的int[]数组
     objArr2[1] = new int[3];

=>objArr2[1]<-------------|整数1,整数2,整数3;
        objArr3<--------------|objArr3[0],objArr3[1],objArr3[2](原来的objArr2[1][0],objArr2[1][1],objArr2[1][2],)
这时的objArr2[1]引用的值不在等于objArr3;
objArr2[1][0],objArr2[1][1],objArr2[1][2](三个int型整数)和objArr3[0],objArr3[1],objArr3[2](三个Object对象)不再相等。

(7)//将objArr3[1]的值赋给iArr,即让iArr和objArr3[1]指向同一个数组对象
     int[] iArr = (int[])objArr3[1];

=>objArr3[1]<------------|整数1,整数2......






               objArr2[1] = new Object[3];

作者: 向阳泪无痕    时间: 2013-11-14 22:41
说通俗点就是数组里放数组……通过引用来连接,像指针一样,指向它。输出就是利用引用连接来输出的。
作者: zhanghuxin    时间: 2013-11-15 18:15
谢了啊,有点想法了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2