0

导入 java.util.*;

公共类 test2 {

public static void main(String[] args){
int[] list = {1,2,3,4,5,6,7};
int[] list2 = reverse(list);
 System.out.print(list2);
}

public static int[] reverse(int[] list){
    int[] result = new int[list.length];

    for(int i=0, j=list.length-1; i<list.length; i++,j--){
        result[j] = list[i];}

    return result;  }

}

这是我教科书中的代码。但是当我打印 list2 时,它显示了这个奇怪的消息:[I@7b963273 我不知道代码有什么问题。请帮帮我!

4

3 回答 3

1

原始类型数组本身就是一个对象。当您使用 System.out.print() 打印它时,它会调用Object 类的toString()方法。在 Object 类中是这样定义的:

public String  toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

打印您使用的返回数组:

System.out.println(Arrays.toString(list2));

编辑
如果你想从方法返回一个数组,你应该完全按照你在代码中的做法。

假设“合并”是一种方法,而 arr1 和 arr2 是数组,那么您可以这样做:

public static int[] merge(int arr1[], int arr2[])
{
  int[] result = new int[arr1.length + arr2.length];
  int counter = 0 ;
  for ( int i =0 ;i < result.length ; i++)
  {
    if ( i >= arr1.length)
    {
      result[i] = arr2[counter++];
    }
    else
    {
      result[i] = arr1[i];
    }
  }
 return result;
}

然后您可以将合并打印为:

System.out.println(Arrays.toString(merge(arr1,arr2));
于 2013-03-02T08:00:23.020 回答
1

toString()直接在数组上调用(隐式)。数组不会覆盖toString(),因此您可以从以下位置获取默认实现Object

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

因此,在您的输出中,该[I部分是int[]类的“名称”(打印int[].class.getName(),它将显示相同的内容),数字是十六进制数组的哈希码。(这又没有被覆盖 - 它没有考虑 tha 数组的内容。)

这与数组的来源无关 - 如果您调用以下命令,您将获得相同类型的输出(具有不同的数字):

System.out.print(list);

通话前reverse

你应该使用Arrays.toString(int\[\])

System.out.println(Arrays.toString(list2));
于 2013-03-02T08:00:57.390 回答
1

System.out.println(list2);调用Object#toString()返回组合的方法Classname+@+Hex_Number_Of_Hashcode

你必须使用重载Arrays.toString(list2);打印数组的字符串表示形式。

于 2013-03-02T08:01:12.583 回答