-6
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*/
    }
}

But what does happen when we use "x=y" ?Does address of y goes to x or something else?Is this garbage value?

4

3 回答 3

2

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

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

于 2013-05-21T09:15:56.873 回答
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

于 2013-05-21T09:27:21.030 回答
0

Value / Reference and assignments让我们在java中理解:

1)此代码为您提供指向数组和堆地址的值引用指针。这仅表示X 和 Y 的内存地址。因为数组是对象,而 Java 对象保存地址指针而不是实际值。XY

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

2)此代码x=yY的堆地址分配给X。现在 X 和 Y 都指向堆中的相同地址。这称为参考赋值

3)此行将System.out.println(x)打印与 has 相同的地址Y。参考点#2

4)这一行System.out.println(x[2])给出了数组中元素的值。元素是整数。Integer 是 Java 中的原始数据类型。原始数据类型拥有真正的价值,而不是堆中的地址。

答案更新:

1) [I@5445a表示堆中 Array 对象的符号引用

2) [表示数组维数。(一维)

3) I表示数组的类型。(整数)

4) @5445a是 Array Object 的整数哈希码。然后将其转换为堆中的实际引用。并且不要假设实际地址是十六进制,它也可以是其他格式。这取决于各个 JVM 实现。其供应商特定。

于 2013-05-21T09:25:25.940 回答