2012-08-29 43 views
1

你能解释一下为什么这个代码打印阵列:内存地址或内容?

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从数组中的Vectors和Vectors派生出来,那么这种不同行为的原因是什么?

回答

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 

等等。

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

4

堆栈有一个重写的toString()方法,它遍历每个元素并打印它们,因此您会看到格式化的打印。您可以使用Arrays.toString(test)以折叠的方式打印数组的内容。到目前为止,您正在对数组对象做一个toString,而不是它的内容。

您可以参考this来了解数组对象的默认toString()实现,并因此了解打印测试数组时您注意到的输出。

+1

数组是基元,因此打印它们会导致仅打印参考 – Sednus

1

Stack>Vector>AbstractList>AbstractCollection

AbstractCollection定义了toString(),这就是System.out.println调用得到字符串表示的内容。

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