java中的数组变量在内存中怎样分配?

以下代码:
//数组中,使用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.

第1个回答  2011-04-22
首先 数组比较值不是你这样比的 应该先判断两个数组的length是不是相等 然后再依次比较才行 你这样比较的是abc三个引用的地址值 必然是不相等的 所以是false
然后 对于数组 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

第2个回答  2011-04-25
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这两处,他不是比较的栈内存中的,而是比较他们所指向的堆内存中的首地址是否相同。
第3个回答  2011-04-23
b==c ,c==d本来应该是true,当两个是字符串的时候(不是数组)。
对于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()比较肯定不相等

本回答被提问者采纳
第4个回答  2011-04-24
不管是equals还是==都是比较的hashcode,只要hashcode相等就为true。可以比较每个数组的值。例如:b[0].equals(c[0]) true
第5个回答  2011-04-22
记不太清了,数组就是对象,对象的话equals比较的话就是比较对象的内存地址

java在声明一个变量时有没有分配内存空间?
1、栈区— 由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源 2、堆区— 一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收 3、静态区— 存放全局变量,静态变量和字符串常量,不...

Java程序运行时,没有赋值的基本类型变量会在内存中分配空间吗?
1、寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。2、 栈:保存局部变量的值,包括:1)用来保存基本数据类型的值;2)保存类的实例,即堆区对象的引用(指针)3)也可以用来保存加载方法时的帧 3、堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变...

Java 的内存管理机制是怎样的?
Java的内存分配有三种, \\x0d\\x0a1、静态存储区:内存在程序编译时就分配好了,比如静态变量; \\x0d\\x0a2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 \\x0d\\x0a3、堆区:对象(包括数组)都是在堆中创建的。程序在...

JAVA里String数组在内存分配中分配的空间每个占几个字节?
java中一个int占4个字节,由于java是unicode编码,一个char可以占两个字节,可以存储一个汉字。一个String,要看有几个字母或者几个汉字,一个英文字母就是一个字节,一个汉字就是两个字节,以此类推计算。

java中的变量各占得字节数
boolen:1个字节int:4个字节float:4个字节double:8个字节char:2个字节byte:1个字节short:2个字节long:8个字节

java中内存的概念? java中环境变量的设置?
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈...

数组的存储方式
1、栈内存:在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配,当在一段代码中定义一个变量时,java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,java会自动释放掉为该变量所分配的内存空间;2、堆内存:堆内存用来存放由new运算符创建的对象和数组,在堆中分配...

Java数组是存储在内存中的什么地方
java可以直接保留下来。说明虚拟机自动给我们申请了动态内存保存对象。此处分配的内存也需要垃圾回收机制管理。没门语言都有原始类型,方法或函数中返回的原始类型不需要从堆上分配内存,直接复制给接收变量,或代码运行的形参所分配的空间中即可。从操作系统理解,内存分为内核使用的内存与程序使用的内存,java...

JAVA里,ArrayList在内存分配上究竟是怎样的
1、ArrayList是用数组实现的,这个数组的内存是连续的,不存在相邻元素之间还隔着其他内存。2、索引ArrayList时,速度比原生数组慢是因为你要用get方法,这是一个函数调用,而数组直接用[ ]访问,相当于直接操作内存地址,速度当然比函数调用快。3、新建ArrayList的时候,JVM为其分配一个默认或指定大小的...

java中的几种基本类型?
byte是JAVA中最小的数据类型,它在内存中占8位(8个bit),取值范围从-128到127 赋值:byteI=127 short短整型 short类型在内存中占2个字节,取值范围从-32768到32767 赋值:shorti=32767;char字符型 char类型在内存中占2个字节。表示一个字符,也可以使用ASCII码范围内的值来给char型的变量赋值。由于...

相似回答