java中的数组变量在内存中怎样分配?
以下代码://数组中,使用new和不使用的区别测试Strinq[]b=newString[]{"aaa","bbb","ccc");String[]c={"aaa","b...
以下代码:
//数组中,使用new和不使用的区别测试
Strinq[]b=new String[]{"aaa","bbb","ccc");
String[]c={"aaa","bbb","ccc"};
String[]d={"aaa","bbb","ccc"};
print("\nb.equal3(c):"+(b.equals(c))):
print("b一c:"+(b==c)):
print(.\nc.equals(d):"+(c.equals(d))):
pnnt(.c一d:四+(c~d))二
结果:
输出了4个false.
这样貌似说明对于数组的情况,即使没有使用new,编译器也会自动加上new,在堆中分配变量?
代码有些错误,更正如下:
Strinq[]b=new String[]{"aaa","bbb","ccc");
String[]c={"aaa","bbb","ccc"};
String[]d={"aaa","bbb","ccc"};
print("\nb.equal3(c):"+(b.equals(c)));
print("b==c:"+(b==c));
print(\nc.equals(d):"+(c.equals(d)));
print("c==d:"+(c==d));
我这个问题的主要疑问是在b==c和c==d两处。我觉得c==d应该是true才对啊?因为他们都是在栈内存中开辟的,开辟d时应该检测到已经有相同的c,所以将d指向c,这样一来c==d应该是true. 展开
//数组中,使用new和不使用的区别测试
Strinq[]b=new String[]{"aaa","bbb","ccc");
String[]c={"aaa","bbb","ccc"};
String[]d={"aaa","bbb","ccc"};
print("\nb.equal3(c):"+(b.equals(c))):
print("b一c:"+(b==c)):
print(.\nc.equals(d):"+(c.equals(d))):
pnnt(.c一d:四+(c~d))二
结果:
输出了4个false.
这样貌似说明对于数组的情况,即使没有使用new,编译器也会自动加上new,在堆中分配变量?
代码有些错误,更正如下:
Strinq[]b=new String[]{"aaa","bbb","ccc");
String[]c={"aaa","bbb","ccc"};
String[]d={"aaa","bbb","ccc"};
print("\nb.equal3(c):"+(b.equals(c)));
print("b==c:"+(b==c));
print(\nc.equals(d):"+(c.equals(d)));
print("c==d:"+(c==d));
我这个问题的主要疑问是在b==c和c==d两处。我觉得c==d应该是true才对啊?因为他们都是在栈内存中开辟的,开辟d时应该检测到已经有相同的c,所以将d指向c,这样一来c==d应该是true. 展开
6个回答
展开全部
首先 数组比较值不是你这样比的 应该先判断两个数组的length是不是相等 然后再依次比较才行 你这样比较的是abc三个引用的地址值 必然是不相等的 所以是false
然后 对于数组 new出来以后 是放在堆中 也就是你的aaa bbb ccc 是在堆中
然后栈中有一个a 保存 堆中aaa bbb ccc这个数组的地址 也就是 a 指向了 那个数组
当你再申请c 和d的时候 首先会到堆中去寻找是不是已经有了aaa bbb ccc 如果有了 就指向 没有就new 所以 后面的 c和d 其实指向的也是同一个地方。
然后 对于数组 new出来以后 是放在堆中 也就是你的aaa bbb ccc 是在堆中
然后栈中有一个a 保存 堆中aaa bbb ccc这个数组的地址 也就是 a 指向了 那个数组
当你再申请c 和d的时候 首先会到堆中去寻找是不是已经有了aaa bbb ccc 如果有了 就指向 没有就new 所以 后面的 c和d 其实指向的也是同一个地方。
追问
代码有些错误,更正如下:
Strinq[]b=new String[]{"aaa","bbb","ccc");
String[]c={"aaa","bbb","ccc"};
String[]d={"aaa","bbb","ccc"};
print("\nb.equal3(c):"+(b.equals(c)));
print("b==c:"+(b==c));
print(\nc.equals(d):"+(c.equals(d)));
print("c==d:"+(c==d));
我这个问题的主要疑问是在b==c和c==d两处。我觉得c==d应该是true才对啊?因为他们都是在栈内存中开辟的,开辟d时应该检测到已经有相同的c
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
展开全部
b存在于栈内存中 new String[]存在于堆内存中,new一个对象的时候,b就指向了堆内存中的new String[]的首地址,其它同理!
同时你比较数组的方式也错了
应该是
Strinq[]b=new String[]{"aaa","bbb","ccc");
String[]c={"aaa","bbb","ccc"};
System.out.println(java.util.Arrays.equals(b,c));
这样的,
你可以测试下!
我这个问题的主要疑问是在b==c和c==d两处。我觉得c==d应该是true才对啊?因为他们都是在栈内存中开辟的,开辟d时应该检测到已经有相同的c,所以将d指向c,这样一来c==d应该是true.
b==c和c==d这两处,他不是比较的栈内存中的,而是比较他们所指向的堆内存中的首地址是否相同。
同时你比较数组的方式也错了
应该是
Strinq[]b=new String[]{"aaa","bbb","ccc");
String[]c={"aaa","bbb","ccc"};
System.out.println(java.util.Arrays.equals(b,c));
这样的,
你可以测试下!
我这个问题的主要疑问是在b==c和c==d两处。我觉得c==d应该是true才对啊?因为他们都是在栈内存中开辟的,开辟d时应该检测到已经有相同的c,所以将d指向c,这样一来c==d应该是true.
b==c和c==d这两处,他不是比较的栈内存中的,而是比较他们所指向的堆内存中的首地址是否相同。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
b==c ,c==d本来应该是true,当两个是字符串的时候(不是数组)。
对于String数组:
系统都为s1和s2分配单独的内存空间
对于String数组:
系统都为s1和s2分配单独的内存空间
追问
那是不是编译器会自动为String[]c={"aaa","bbb","ccc"};的前面添加new关键字?
即变为String[]c=new String[]{"aaa","bbb","ccc"};
追答
现在我应该答案了
String[]c={"aaa","bbb","ccc"};
String[]d={"aaa","bbb","ccc"};
System.out.println(c);
System.out.println(d);
在我电脑上输出:
[Ljava.lang.String;@18a992f
[Ljava.lang.String;@4f1d0d
这应该是地址,所以,equals()比较肯定不相等
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不管是equals还是==都是比较的hashcode,只要hashcode相等就为true。可以比较每个数组的值。例如:b[0].equals(c[0]) true
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
记不太清了,数组就是对象,对象的话equals比较的话就是比较对象的内存地址
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询