数组返回内存分配而不是Java中的值

Array returning memory allocation instead of value in Java

本问题已经有最佳答案,请猛点这里访问。

考虑这样一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void array()
{
    String myString ="STACKOVERFLOW";
    int [] checkVal = new int[myString.length()];

    for(int i=0; i<myString.length();i++){
        checkVal[i] = (int)myString.charAt(i);
    }

    System.out.println(checkVal[0]);
    System.out.println(checkVal[1]);
    System.out.println(checkVal[2]);
    System.out.println(checkVal[3]);
    System.out.println(checkVal[4]);
    System.out.println(checkVal);
}

这将输出以下内容:

1
2
3
4
5
6
83
84
65
67
75
[I@fc9944

有人能给我解释一下吗?如何从数组中而不是从其内存分配中检索正确的信息?


如果您希望它打印得漂亮,请使用Arrays.toString进行打印:

1
System.out.println(Arrays.toString(checkVal);

如果没有,它将只打印出数组的toString,该数组是从Object继承的,生成一个String包含它的类型和哈希代码:

The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:

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

这个答案也有相关信息。


当您试图打印任何对象的值时,会调用它的toString()方法(从对象类继承)。如果类不重写此方法,则调用此方法的超类实现。对象类ToString方法返回对象的哈希代码。

您看到的输出是数组对象的哈希代码。因此,要打印数组对象的值,您需要遍历它并打印所有值。或者其他的解决方案可以是使用像list或set这样的集合(即动态数组),当调用其toString()方法时,该集合将打印其中的所有值。

像array list和simple array这样的集合的区别在于,列表可以根据需要动态增长或收缩(即其大小是可变的)。它还提供许多内置API方法来执行列表中的各种操作。


在checkval[4]之后,您引用的checkval没有索引[]。这似乎与您的垃圾线相对应。如果您试图让所有的值都在最终的System.out中打印,那么您似乎可以对数组进行循环,并将这些值保持在一个数字之间有空格的字符串上,然后打印该字符串。