Array.toString返回一个内存地址,而不是实际值

时间:2019-01-15 09:46:19

标签: java arrays

我想在一个应用程序中输入一个数字,即盒子的数量,创建一个数组,然后以盒子的高度填充该数组,然后以其高度打印出该数组中的所有盒子。

public class Boxes {
    static class Box {
        int height; 

        Box(int h) {
            this.height = h;
        }
    }

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        Box arr[] = new Box[n];

        for (int i = 0; i < n; i++) {
            int h = s.nextInt();
            arr[i] = new Box(h);
        }

        System.out.println(Arrays.toString(arr));
    }
}

当我输入 3 5 3 2 我希望它打印出5、3、2,但是它打印出一个内存地址。

2 个答案:

答案 0 :(得分:1)

您必须在toString()类中覆盖Box方法:

class Box {
     private final int height;

     public Box(int h){
         height = h;
     }

     @Override
     public String toString(){
         return Integer.toString(height);
     }
}

默认实现是由Object类(java中每个对象的基类)继承的,如下所示:

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

请注意,它不是打印内存地址,而是打印hashcode()方法返回的哈希码的十六进制表示形式

答案 1 :(得分:0)

Arrays.toString循环数组中的每个元素,循环并为每个元素调用String.valueOf(element),并将它们附加到StringBuilder结果中。

String.valueOf(Box box)实际上会调用box.toString(),因为Box类没有重写方法toString(),所以将调用父类Object.toString(),而className @ HexString(hashCode())将被调用被退回。

您可以重写Box中的toString()方法,以返回高度的String值(将打印[5、3、2]),也可以循环并打印数组中每个Box的高度。