问题描述
JAVA中String[]s1=newString[0]和String[]s2=newString[1]是怎么分配内存的?我的理解:1、栈空间分配s1,s2;2、s1指向堆空间某个地址,内容为null;s2指向堆空间某个地址s2[0],然后s2[0]指向某个堆空间,内容为null;不知道这个理解对否,望指点。
解决方案
解决方案二:
很简单,您可以直接打印s1和s2,如果按你的理解应该会输出null和一串地址,但其实应该2个都是有地址的就都不是空的
解决方案三:
指向堆没问题。不过不是null。你不是new了数组么。。
解决方案四:
首先你创建了两个数组对象,所以堆中间是肯定有两个对象的,既然存在两个对象,那个你的栈内存中的地址值就肯定不为空了
解决方案五:
有可能楼主你是对的。对程序员而言,小心不越界就行了。
解决方案六:
其实我觉得楼主的理解就是对的不过不应该把两个的情况分开来看这本身就只属于一种情况引用变量指向了一块内存空间,这个内存空间还未进行赋值个人理解
解决方案七:
第一个也是有地址的,只是它指向的堆空间没有任何的东西,也就是不存在s1[0],第二个你想法是对的
解决方案八:
解决方案九:
0iconst_01anewarrayjava.lang.String[16]4astore_1[t0]5iconst_16anewarrayjava.lang.String[16]9astore_2[t1]
有闲心提问,就没闲心去动动手?数组对jvm来说是很特殊的一种对象,在jvm内部处理,但无论预分配空间是多少,jvm都会用anewarray或者newarray建立一个“数组对象”
解决方案十:
引用8楼HinanaiTenshi的回复:
.......数组对jvm来说是很特殊的一种对象,在jvm内部处理,但无论预分配空间是多少,jvm都会用anewarray或者newarray建立一个“数组对象”
额,对jvm不太熟..我是测试之后看不到结果才提问的。
解决方案十一:
引用1楼sanvnie_kaka的回复:
很简单,您可以直接打印s1和s2,如果按你的理解应该会输出null和一串地址,但其实应该2个都是有地址的就都不是空的
s1和s2栈的地址都会输出,但是s1指向的堆的内容没法输出,s2指向的堆,再指向s2[0],内容是null。所以我认为s1指向的堆的内容是null。(表达不好,哎)
解决方案十二:
长度为0也是数组,仍然会分配数组空间,只是长度为0,第二个当然是长度为1的数组,只是2个一开始内容都是null
解决方案十三:
赞同@xiangnan129@Molly_1994意见