问题描述
- 为什么new int[4]== new int[4]的boolean值为flase
-
如题为什么new int[4]== new int[4]的boolean值为flase。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
解决方案
这个比较的是两次new int[4]的地址,比较的是地址啊。。。
当然会不一样了
解决方案二:
int [][]a=new int[4][4]
解决方案三:
因为是不同地址呀,new产生了int数组,返回了该数组的开头地址,很显然,调用了两次new,是在不同地方开辟的数组,所以地址不同呀
解决方案四:
这个比较的是地址,调用了两次new,地址不同,和字符串比较类似
解决方案五:
==比较的是内存地址,new是创建一个新的内存当然不一样啦
解决方案六:
两次new方法,创建两个对象,它们所对应的内存空间的地址是不一样的,而==这个比较,比较的是地址,所以返回的是false
解决方案七:
这还不简单,你输出两个的值看看就只知道了;int[] 属于引用类型,引用类型有一个共同的父类Object,在这里就调用了Object的toString方法,获得了两个不同对象的句柄(地址),所以你用==判断两个不同的地址肯定会返回false啦,希望能帮到你
System.out.println(new int[4]);
System.out.println(new int[4]);
解决方案八:
给你一段代码(C++的,但是基本上是通的):
#include <iostream>
using namespace std;
int main()
{
int *p,*q;
p = new int[4];
q = new int[4];
cout<<p<<endl;
cout<<q<<endl;
cout<<&p<<endl;
cout<<&q<<endl;
return 0;
}
运行结果(linux-64):
0x16d8010
0x16d8030
0x7fffd019ecf0
0x7fffd019ecf8
嗯嗯,这里面涉及到堆栈的问题
栈区存放的是:函数的参数以及函数中的局部变量(如上题中的:p和q,都在栈区中)
堆区存放的是:程序运行过程中再次申请的空间也就是常用的(New,malloc,free,delete)函数
至于为什么由:0x16d8010跳到0x16d8030
只是因为在堆区分配了四个整形字节分别为:
0x16d8010
0x16d8014
0x16d8018
0x16d801c
又因为指向的堆区分配空间是不连续的,所以下一次分配到了
0x16d8030处,
至于后面两个值,是因为指针在linux-64位占8字节
所以他们不相等,是在正常不过的事情了!!!