A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

int[] arr=new int[3];
问题:     上面创建int数组时,怎么分配内存的?arr是一个引用变量,是通过指针指向new int[3](存在堆里面)对吧,那么,栈里面为arr分配几个指针,是3个还是1个?
疑问1****: java中创建数组时,栈中分配几个指针,是一个还是“数组长度”个?
疑问2****:   如果是一个,那么,这个指正指向谁????
疑问3****:   如果指向的是第一个元素,那么,该指针怎么索引数组的其它元素????
疑问4****:   如果疑问3中索引方式是通过指针值加上数组元素所占内存大小的来索引下一个元素,那么,当元素不是基本数据类型,而是摸个对象的实例时,又是怎么索引的???(实例对象数组的元素在元素创建时可是null的,对吧。而且在数组使用过程中数组元素指向的对象是可以变的,这不就意味着内存在变吗!!)
综合上述:我觉得数组创建时(我指的是被new出来时),栈中会为数组创建数组长度个指针分别指向每个元素。
但是,问题又来了。
问题5****:
int[] arr;//这里分配几个指针(栈)??
arr=new int[3];

11 个回复

倒序浏览
你5个问题可以概括为一个问题:怎么访问数组中的每个元素。

就拿你的代码片段举例。
  1. int[] arr = new int[3];
复制代码

arr保存的是堆中数组的起始地址p,数组在堆中是占据一片连续空间的。因此要访问下标i的元素,其地址为p+i*4 ,到这个地址就可以访问到对应元素了。其中4是int类型数据的长度,如果是double数组,则4变成8即可
回复 使用道具 举报
本帖最后由 路文龙 于 2015-3-8 17:21 编辑
fantacyleo 发表于 2015-3-8 16:33
你5个问题可以概括为一个问题:怎么访问数组中的每个元素。

就拿你的代码片段举例。

如果不是基本数据类型的对象数组呢,地址如何变化,每个实例对象的大小是不确定的啊,Person p[3] = new Person[3];

回复 使用道具 举报
路文龙 发表于 2015-3-8 17:19
如果不是基本数据类型的对象数组呢,地址如何变化,每个实例对象的大小是不确定的啊,Person p[3] = new Pe ...

根据类定义就可以算出每个类的实例的大小,比如
  1. class Person {
  2.     String name;
  3.     int age;
  4. }
复制代码

int是4个字节。String是引用变量,存放地址值,这个也是固定大小的。这样就可以算出Person所占的空间
回复 使用道具 举报
fantacyleo 发表于 2015-3-8 22:35
根据类定义就可以算出每个类的实例的大小,比如

int是4个字节。String是引用变量,存放地址值,这个也是 ...

谢谢,还是不太明白,String是引用变量但是堆内存里面 申请的存放person实例的内存中放的是一个String的引用?还是一个字符串。
回复 使用道具 举报
路文龙 发表于 2015-3-8 22:47
谢谢,还是不太明白,String是引用变量但是堆内存里面 申请的存放person实例的内存中放的是一个String的 ...

当然是引用。包括Person数组里存放的都是Person的引用(地址值),所以只要知道Person数组的起始地址就可以轻松算出Person数组每个元素的地址

点评

非常感谢。  发表于 2015-3-8 23:09
回复 使用道具 举报
这么说吧、
回复 使用道具 举报
学习学习
回复 使用道具 举报
问题:【这个问题就有问题、首先我没记错的话JAVA是没有指针的】,答:疑问一:JAVA创建数组时、int[] arr在栈内存开辟空间用来存放指向堆内存的地址,new int[3]表示在堆内存产生一个int类型,长度为3的一维数组(按照我的理解、可以认为是一个有三格空间的箱子);疑问二:指向谁?指向的是外面的箱子(在堆内存的地址)、而不是指向里面的具体哪一格;疑问3,4:无从说起了、问题5:int【】arr 这是声明一个数组吧(在占内存中产生一个应用的变量存储空间),arr=new int[3],把new int[3]在堆内存的地址赋值给arr(不知道能不能这么理解),不会说了,好吧、数组的静态、动态又忘了哭
回复 使用道具 举报
数组是一种引用类型,数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使一个或者多个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变。当仅定义一个数组变量(int[] num)时,该变量还未指向任何有效的内存,因此不能指定数组的长度,只有对数组进行初始化(为数组元素分配内存空间)后才可以使用。数组初始化分为静态初始化(在定义时就指定数组元素的值,此时不能指定数组长度)和动态初始化(只指定数组长度,由系统分配初始值)。
回复 使用道具 举报
进来学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马