你能解释为什么这段代码
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派生自数组的向量和向量,那么这种不同行为的原因是什么?
答案 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
的默认实现。