Java 为什么while(arar==arr){arr[0]=2;}的输出会显示这一点([I@60e53b93)?

Java 为什么while(arar==arr){arr[0]=2;}的输出会显示这一点([I@60e53b93)?,java,arrays,loops,object,Java,Arrays,Loops,Object,每次我试图使用二进制运算符将两个非布尔类型设置为彼此相等时,基本上都会在输出屏幕中看到这一点 我不明白的是,如果编译器继续编译,但显示[I@60e53b93(在我看来这是一个地址), 这是因为它使用arr作为对象,还是因为它实际上正在工作并且循环正在无限地运行 所以我想做的只是试验一下数组,看看我能用它们做些什么,因为我已经有一段时间没有使用Java了 所以我基本上做的是: int [] arr = {1,2,3,4,5,6}; int[]arar={1,2,3,4,5,6};

每次我试图使用二进制运算符将两个非布尔类型设置为彼此相等时,基本上都会在输出屏幕中看到这一点

我不明白的是,如果编译器继续编译,但显示[I@60e53b93(在我看来这是一个地址), 这是因为它使用arr作为对象,还是因为它实际上正在工作并且循环正在无限地运行

所以我想做的只是试验一下数组,看看我能用它们做些什么,因为我已经有一段时间没有使用Java了

所以我基本上做的是:

    int [] arr = {1,2,3,4,5,6};
    int[]arar={1,2,3,4,5,6};
    while (arar==arr){
        arr[0]=2;
    }

    System.out.println(arr);
因此,我基本上期望出现一个危险信号,但随后代码运行并显示出来[I@60e53b93我不明白为什么


有人能给我解释一下这一点吗?如果可能的话,我如何显示数组arr,即使它是在一个连续的循环中?

因为
arr
只是一个数组的引用。它不是数组的内容。引用保存了数组实际内容所在的内存位置。调用
toString()对象上的
将默认输出其内存位置。(
toString()
将由
System.out.println隐式调用)

Java中的每个对象都有一个
toString()
方法。尽管基本上可以对所有对象调用
System.out.println
。有些对象有一个自定义的
toString
实现并打印有用的内容,而其他对象(如数组)只打印它们的内存位置

如果要显示数组内容,必须在数组上循环:

for(int elem : arr) {
  System.out.println(elem);
}

这里发生了两件事:

  • arr
    永远不会等于
    arar
    ,因为
    =
    使用引用相等;因为
    arr
    arar
    可以独立修改,所以它们不是同一个对象
  • System.out.println(anyArray)
    将始终像您一样显示输出,因为数组没有有用的
    toString
    函数
您可以通过使用数组中的静态方法来解决这两个问题:

while (Arrays.equals(arr, arar)) {
  ...
}
System.out.println(Arrays.toString(arr));