打印数组:内存地址或其内容?

时间:2012-08-29 16:58:41

标签: java arrays vector

你能解释为什么这段代码

int[] test={0,0,0,0,0};
System.out.println(test);

打印类似[I @ 42e816(可能是内存地址)但是这段代码

 Stack<Integer> stack = new Stack<Integer>();
 stack.push(1);
 stack.push(3);
 stack.push(5);
 stack.push(2);
 stack.push(4);
 System.out.println(stack);

打印“[1,3,5,2,4]”?有什么不同?

如果Stacks派生自数组的向量和向量,那么这种不同行为的原因是什么?

3 个答案:

答案 0 :(得分:5)

集合有一个定义良好的toString()方法,但是数组被遗忘了恕我直言,并使用默认的Object.toString()以及许多其他非常有用的默认方法。您需要调用之后添加的许多辅助类之一,以使数组更有用。

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

十六进制是对象的默认hashCode()而不是地址。它可能不是唯一的,即使数组在内存中移动,这个数字也不会改变。

对于数组的辅助类

java.lang.reflect.Array
java.util.Arrays
java.lang.System.arraycopy(); // one method

额外的

org.apache.commons.lang.ArrayUtils
org.uispec4j.utils.ArrayUtil
toxi.util.datatypes.ArrayUtil
net.sf.javaml.utils.ArrayUtils
com.liferay.portal.kernel.util.ArrayUtil

还有更多。

不是数组不应该有自己的方法,而是有太多的选择。 ;)

答案 1 :(得分:4)

Stack有一个重写的toString()方法,它遍历每个元素并打印它们,因此你会看到格式化的打印。

您可以使用Arrays.toString(test)以完整的方式打印数组的内容。截至目前,您正在对数组对象执行toString而不是它的内容。

您可以参考this来理解数组对象的默认toString()实现,从而了解打印测试数组时的注意事项。

答案 2 :(得分:1)

Stack&gt; Vector&gt; AbstractList&gt; AbstractCollection

AbstractCollection定义toString(),这是System.out.println调用以获取字符串表示形式的内容。

int[]不是这些对象类型之一 - 它是本机数组,因此它使用Object类中的toString的默认实现。