Java单维数组将两个不同大小的变量等同起来

时间:2013-05-21 09:12:00

标签: java

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还是其他什么?这是垃圾值吗?

3 个答案:

答案 0 :(得分:2)

  

但是当我们使用“x = y”时会发生什么?

y引用的数组也会被x引用,使得最初由x引用的数组有资格进行垃圾回收(因为它没有被引用到其他任何地方)例子。)

答案 1 :(得分:0)

让我们了解java中的Value / Reference and assignments

1)此代码为您提供 值引用指针 堆地址 数组XY。这仅仅意味着X和Y的 内存地址 。因为Array是对象而Java对象包含地址指针而不是实际值。

System.out.println(x);/*gives something like [I@5445a*/
System.out.println(y)

2)此代码x=yY的堆地址分配给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