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对象也存放在堆中的其它地方。 展开
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对象也存放在堆中的其它地方。 展开
3个回答
展开全部
原帖地址: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这么实现是合理的,在函数里中分配的固定长度数组放在栈中可以加快运行效率,而且在多线程的情况下,不用像堆分配有加锁。只是大家在写程序的过程中注意在函数里定义太长的数组需要注意,否则栈溢出,程序就崩溃了。
数组单一说在栈中还是堆中都是错误的,分为几种情况:
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这么实现是合理的,在函数里中分配的固定长度数组放在栈中可以加快运行效率,而且在多线程的情况下,不用像堆分配有加锁。只是大家在写程序的过程中注意在函数里定义太长的数组需要注意,否则栈溢出,程序就崩溃了。
追问
谢谢提点。不过目前还有很多地方(如线程,栈溢出,加锁)看不懂。如果简单的将数组看做是对象,都存放在堆里更好理解一些。不过现在知道有这么回事了。
追答
不客气,记得去顶原帖子啊,毕竟是转载的
展开全部
123正确,4错误,因为:数组对象可以存储引用类型的,例如:二维数组,所以呢,2个Human的对象引用是存储在栈内存中的,2个Human是存储在堆内存的
追问
但是这2个Human对象引用同时也组成了一个数组,如果将数组看做对象,这个Human对象引用不是应该放在堆中吗?
追答
你想多了,只要记住对象的引用存在栈里面,对象存储在堆里面,就可以了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我认为全都 正确.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询