Java中数组对象的存储位置?

想问问以下观点是否正确:1,Java中的数组是对象,数组类型属于引用类型。2,对象存储在堆中,对象引用存储在栈中。3,int[]x=newint[100];那么x存放在栈... 想问问以下观点是否正确:
1,Java中的数组是对象,数组类型属于引用类型。
2,对象存储在堆中,对象引用存储在栈中。
3,int[] x=new int[100];
那么x存放在栈中,100个为默认值0的整数存放在堆中。x指向这100个数。
4,Human是类,Human[] x=new Human[2];x[0]=new Human();x[1]=new Human();
那么x存放在栈中,指向2个Human对象引用;2个为Human对象引用存放在堆中,并分别指向2个Human对象;2个Human对象也存放在堆中的其它地方。
展开
 我来答
善良的敲钟人
推荐于2016-09-29 · TA获得超过904个赞
知道小有建树答主
回答量:783
采纳率:50%
帮助的人:439万
展开全部
原帖地址:http://hi.baidu.com/sqldebug/blog/item/9758b9ffa605e51a09244d91.html

数组单一说在栈中还是堆中都是错误的,分为几种情况:

1、固定数组在函数体内分配是在栈中的

我们做一个试验,一般DELPHI程序线程的栈大小是1M,如果我们函数体中申请4M大小的数组,报栈溢出,则表示数据的大小是在栈中的。

const
CArrayCount = 1024*1024*4;

procedure TForm1.btnMainThreadClick(Sender: TObject);
var
MainThreadArray: array[1..CArrayCount] of Char;
i: Integer;
begin
for i := Low(MainThreadArray) to High(MainThreadArray) do
MainThreadArray[i] := #0;
end;

我把以上代码在主线程中测试时,确实报了栈溢出,如果这时你把DELPHI程序的栈调大为6M则正确,表示在函数体中申请的数组是在栈中的。

2、固定数组在类中分配是在堆中的

我们在类中加一下定义语句

FFixArray: array[1..CArrayCount] of Char;

程序正常,表示在类中分配固定数组是在堆中的。

3、固定数组全局变量是在堆中的

我们在程序定义全部数组

GFixArray: array[1..CArrayCount] of Char;

程序也正常,表示全局固定长度是在堆中的。

3、动态数组不管在函数体中、类中、全局变量都是在堆中

如果你会汇编,看一下汇编就明白了。DELPHI这么实现是合理的,在函数里中分配的固定长度数组放在栈中可以加快运行效率,而且在多线程的情况下,不用像堆分配有加锁。只是大家在写程序的过程中注意在函数里定义太长的数组需要注意,否则栈溢出,程序就崩溃了。
追问
谢谢提点。不过目前还有很多地方(如线程,栈溢出,加锁)看不懂。如果简单的将数组看做是对象,都存放在堆里更好理解一些。不过现在知道有这么回事了。
追答
不客气,记得去顶原帖子啊,毕竟是转载的
书水浪z
2013-03-24
知道答主
回答量:24
采纳率:0%
帮助的人:2.8万
展开全部
123正确,4错误,因为:数组对象可以存储引用类型的,例如:二维数组,所以呢,2个Human的对象引用是存储在栈内存中的,2个Human是存储在堆内存的
追问
但是这2个Human对象引用同时也组成了一个数组,如果将数组看做对象,这个Human对象引用不是应该放在堆中吗?
追答
你想多了,只要记住对象的引用存在栈里面,对象存储在堆里面,就可以了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友10c6f4b
2013-03-24 · TA获得超过613个赞
知道小有建树答主
回答量:1083
采纳率:100%
帮助的人:201万
展开全部
我认为全都 正确.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式