1

Can you explain why this code

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

prints something like [I@42e816 (perhaps memory address) but this code

 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);

prints "[1, 3, 5, 2, 4]"? What's the difference?

If Stacks derive from Vectors and Vectors from arrays, what's the cause of this different behavior?

4

3 回答 3

5

这些集合有一个定义明确的 toString() 方法,但是数组被遗忘了恕我直言,并使用默认的 Object.toString() 以及来自 Object 的许多其他默认方法,这些方法也不是很有用。您需要调用后来添加的许多帮助类之一,以使数组更有用。

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

还有很多。

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

于 2012-08-29T17:01:55.137 回答
4

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

您可以使用Arrays.toString(test)格式化的方式打印数组的内容。到目前为止,您正在对数组对象执行 toString 而不是它的内容。

您可以参考内容来了解​​数组对象的默认 toString() 实现,从而了解您在打印测试数组时注意到的输出。

于 2012-08-29T17:00:35.267 回答
1

Stack> Vector> AbstractList> AbstractCollection

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

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

于 2012-08-29T17:04:43.147 回答