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]」を出力しますか?違いは何ですか?

スタックがベクターから派生し、ベクターが配列から派生している場合、この異なる動作の原因は何ですか?

4

3 に答える 3

5

コレクションには明確に定義されたtoString()メソッドがありますが、配列はIMHOについて忘れられており、デフォルトのObject.toString()と、あまり役に立たないObjectの他の多くのデフォルトメソッドを使用しています。配列をより便利にするために、後で追加された多くのヘルパークラスの1つを呼び出す必要があります。

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

16進数は、アドレスではなく、オブジェクトのデフォルトの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)配列の内容をforattedの方法で印刷するために使用できます。今のところ、配列オブジェクトの内容ではなく、配列オブジェクトに対してtoStringを実行しています。

これを参照して、配列オブジェクトのデフォルトのtoString()実装を理解し、テスト配列を出力するときに気付く出力を理解できます。

于 2012-08-29T17:00:35.267 に答える
1

Stack>>> 。Vector_ AbstractList_AbstractCollection

AbstractCollectionを定義します。これは、文字列表現を取得するためにtoString()呼び出されるものです。System.out.println

int[]はこれらのオブジェクトタイプの1つではなく、ネイティブ配列であるためtoString、Objectクラスのデフォルトの実装を使用します。

于 2012-08-29T17:04:43.147 に答える