java-为什么new int[4]== new int[4]的boolean值为flase

问题描述

为什么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字节

所以他们不相等,是在正常不过的事情了!!!

时间: 2024-08-23 23:55:38

java-为什么new int[4]== new int[4]的boolean值为flase的相关文章

java中数组的问题,int [3]表示有三个元素的类型是int的吗

问题描述 java中数组的问题,int [3]表示有三个元素的类型是int的吗 int [3]表示有三个元素的类型是int的吗 int [3] [ ] int [ ] [3] 有语法错误吗? int [3] [ ] ==int [ ] [3] 吗 解决方案 你刚学的java吧. int[3]没有这种写法 一般是int[] a =new int[3]代表的是一个数组. int [3] [ ]这种是二维数组.不写默认为0. int [3] [ ] ==int [ ] [3]哪有这种写法~ 解决方案二

谈谈Java中整数类型(short int long)的存储方式_java

在java中的整数类型有四种,分别是 byte  short int long 其中byte只有一个字节 0或1,在此不详细讲解. 其他的三种类型如下: 1. 基本类型:short 二进制位数:16 包装类:java.lang.Short 最小值:Short.MIN_VALUE=-32768 (-2的15此方) 最大值:Short.MAX_VALUE=32767 (2的15次方-1) 2. 基本类型:int 二进制位数:32 包装类:java.lang.Integer 最小值:Integer.M

优先级-int x=4;求x+=x-=x-x--的值

问题描述 int x=4:求x+=x-=x-x--的值 int x=4:求x+=x-=x-x--的值,为什么先计算x-=x-x,--的优先级不是比赋值运算符的优先级高吗? 解决方案 x+=x-=x-x--; 01052D35 mov eax,dword ptr [x] 01052D38 sub eax,dword ptr [x] 01052D3B mov ecx,dword ptr [x] 01052D3E sub ecx,eax 01052D40 mov dword ptr [x],ecx 0

浅析int*p[ ]与int(*p)[ ]的区别

以下是对int*p[ ]与int(*p)[ ]的区别进行了详细的分析介绍,需要的朋友可以参考下   举例说明:1)int* p[2] 是一个指向int型的指针数组,即:p是包含两个元素的指针数组,指针指向的是int型.可以这样来用: 复制代码 代码如下: <SPAN style="BACKGROUND-COLOR: rgb(255,255,255)">#include <iostream> using namespace std; int main(int ar

深入解析int(*p)[]和int(**p)[]

以下是对int(*p)[]和int(**p)[]的使用进行了详细的分析介绍,需要的朋友可以参考下   1. int(*p)[10]:根据运算符的结合律,()的优先级最高,所以p是一个指针,指向的一个维度为10的一维数组. p一个指向数组的某一行 复制代码 代码如下: int a[1][4]={1,2,3,4};     int (*p)[4] = a;//p point to the row of array a     for(int i=0;i<4;i++)     {      cout<

mysql中int(1)和int(11)区别详解

mysql字段定义中INT(x)中的x仅仅指的是显示宽度.该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度.显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示.所以x的定义与存储空间没有任何关系都是4个字节. 作为SQL标准的扩展,MySQL也支持整数类型TINYINT.MEDIUMINT和BIGINT.下面的表显示了需要的每个整数类型的存储和范围. 类型 字节 最小值 最大值     (带符号的/无符号的) (带符号的/无符号的) TINYINT 1

如何理解int *(*a[5])(int, char*);

int *(*a[5])(int, char*);  拆开来分析:typedef int* (*f)(int,char*);f a[5]; 所以a是个5个元素的数组,每个元素为函数指针. 可用代码验证: #include <stdio.h> #include <stdlib.h> int* (*a[5])(int,char*); int *foo(int n, char *s) { int *p; p = (int *)malloc(sizeof(int)); *p = n + a

c++-c#中数组可以直接部分赋值吗??int[] a=new int[5]={1,2}这样写报错

问题描述 c#中数组可以直接部分赋值吗??int[] a=new int[5]={1,2}这样写报错 c#中数组可以直接部分赋值吗??int[] a=new int[5]={1,2}这样写报错,有什么方法可以实现,这样不行,有什么方法可以实现,c++中可以,C#却不行,头有点大,c++很多余C#不同 解决方案 int[] a = new int[] { 1, 2 }.Concat(Enumerable.Repeat(0, 3)).ToArray(); 解决方案二: 作为特例,字符串可以 char

mfc-关于int CDemo1Dlg::connectSPort(int portNum) 函数

问题描述 关于int CDemo1Dlg::connectSPort(int portNum) 函数 int CDemo1Dlg::connectSPort(int portNum) { CommDriver.put_CommPort(portNum); CommDriver.put_InputMode(1); CommDriver.put_InBufferSize(1024); CommDriver.put_OutBufferSize(512); CommDriver.put_Settings