2012-08-29 48 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的默認實現。