为什么while (arar==arr){arr[0]=2;}显示这个([I@60e53b93)? &



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

我不明白的是,如果编译器继续编译它,但显示[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永远不会等于arar,因为==使用参考相等;由于arrarar可以单独修改,所以它们不是同一个对象。
  • System.out.println(anyArray)将始终显示您的输出,因为数组没有一个有用的toString函数。

可以通过使用数组中的静态方法来解决这两个问题:

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

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

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

如果你想显示数组的内容,你必须遍历数组:

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

最新更新