class myArray{
public static void main(String args []){
int x[]={2,3};
int y[]={4,5,6};
System.out.println(x);/*gives something like [I@5445a*/
System.out.println(y);/*[I@5442c */
x=y;
System.out.println(x); /*gives same as that of y (i.e [I@5442c ). What does happen here?*/
System.out.println(x[2]);/* gives 6*/
}
}
但是当我们使用“x = y”时会发生什么?y的地址是x还是其他什么?这是垃圾值吗?
答案 0 :(得分:2)
但是当我们使用“x = y”时会发生什么?
y
引用的数组也会被x
引用,使得最初由x
引用的数组有资格进行垃圾回收(因为它没有被引用到其他任何地方)例子。)
答案 1 :(得分:0)
让我们了解java中的Value / Reference and assignments
:
1)此代码为您提供 值引用指针 至 堆地址 数组X
和Y
。这仅仅意味着X和Y的 内存地址 。因为Array是对象而Java对象包含地址指针而不是实际值。
System.out.println(x);/*gives something like [I@5445a*/
System.out.println(y)
2)此代码x=y
将Y
的堆地址分配给X
。现在X和Y都指向堆中的相同地址。这称为 参考作业 。
3)此行System.out.println(x)
将打印与Y
相同的地址。请参阅 第2点
4)此行System.out.println(x[2])
为您提供Array中元素的值。元素是整数。整数是Java中的原始数据类型。原始数据类型包含 实际值 ,而不是在堆中进行寻址。
答案已更新:
1) [I@5445a
表示堆中Array对象的符号引用。
2) [
表示数组维数。 (1维)
3) I
表示数组类型。 (INT)
4) @5445a
是Array Object的整数哈希码。然后将其转换为堆中的实际引用。并且不要将实际地址假设为Hex,它也可以采用其他格式。这取决于单个JVM实现。它的供应商特定。
答案 2 :(得分:0)
数组变量也像类型变量一样引用。所以x和y只包含对内存中某个数组的引用。让我们来看看这个任务:
但是当我们使用“x = y”时会发生什么?
是的,就像java中的对象一样,数组y的地址存储在x中。结果是x和y引用相同的数组,之前由x引用的数组丢失(最终被垃圾收集)。如果您想要将y的副本分配给x,请尝试:
x = Arrays.copyOf(y, y.length)
提示:如果要打印数组的内容,请尝试使用以下代码:
System.out.println(Arrays.toString(x));
有关Arrays类的更多信息,请尝试:http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html