15
    String[] array = {"a","c","b"};
    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    System.out.println(array);
    System.out.println(list);

forlist [a, b, c]が出力され、for arraysome address が出力されます。array値を出力したいときは、 Arrays.toString(array);which と同じように使用できますlist

toString()値を取得するために直接呼び出すことができないのはなぜだろうかarray。その方が直感的で便利ではないでしょうか。と で異なる処理を行うArrayと、どのような結果になりArrayListますか?

4

6 に答える 6

17

toString配列と配列リストの主な違いは、配列が言語仕様自体の一部であるのに対し、配列リストは Java で記述され、独自の実装 ( override の決定を含む) を持つクラスであることです。特に、JLS 10.7には次のように記載されています。

配列型のメンバーは、次のすべてです。

  • public 最終フィールド長
  • クラス Object 内の同じ名前のメソッドをオーバーライドし、チェック例外をスローしない public メソッド clone。
  • クラス Object から継承されたすべてのメンバー。継承されないオブジェクトの唯一のメソッドは、そのクローン メソッドです。

言い換えれば、言語仕様はtoString配列のメソッドがオーバーライドされるのを防ぐためObject、クラス名とハッシュコードを出力する定義済みのデフォルトの実装を使用します。

なぜこの決定が下されたのかは、おそらく言語の設計者に尋ねるべき質問です...

于 2012-12-08T18:21:09.747 に答える
4

配列に対して toString() を直接呼び出して値を取得できないのはなぜだろうか。

実際toStringには、配列オブジェクトに対してメソッドが呼び出されます。ただし、配列型はクラスtoStringからメソッドをオーバーライドしないため、デフォルトの実装が呼び出され、表示されるフォームの表現が返されます。ObjecttoString

表現は次の形式です: -

[typeOfArray@hashCode

あなたの場合、それは次のようなものです: -

[Ljava.lang.String;@3e25a5

一方、ArrayListインスタンスの場合は、クラスでオーバーライドtoStringされたメソッドArrayListが呼び出されます。

于 2012-12-08T18:20:31.047 に答える
3

簡単な答えは、toString がいくつかの異なる場所で異なる動作で定義されているためです。

Arrays クラスは toString を静的メソッドとして定義し、次のように呼び出されます。

Arrays.toString(arr_name);

ただし、Arrays クラスは、Object クラスから非静的メソッド toString も継承します。したがって、インスタンスで呼び出された場合、オブジェクトの文字列表現を返す Object.toString を呼び出します (例: [Ljava.lang.Object;@4e44ac6a)

したがって、Arrays.toString() と MyObject.toString() は同じ名前で異なるメソッドを呼び出しています。

ArrayList クラスは、非静的メソッドである AbstractCollection クラスから toString を継承するため、次のようにオブジェクトで呼び出すことができます。

MyArrayList.toString();

オブジェクトではなくコレクションの文字列表現であるため、結果は [one, two] のような読み取り可能な形式の値になります。

于 2014-03-08T15:37:34.040 に答える
0

印刷toString()すると、デフォルトで印刷されるためですclassName@HashCode

したがって、印刷array すると上記が印刷されます。

ただし、クラスArrayListによって拡張され、以下のようにメソッドがオーバーライドされる場所AbstractCollectiontoString()

 public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }

オブジェクトの読み取り可能な形式を出力しArrayListます。

于 2012-12-08T18:21:33.313 に答える
0

これは、ArrayList の toString メソッド呼び出しです。しかし、配列の場合、そのようなものは見つかりません。

 /**
 * Returns a string representation of this collection.  The string
 * representation consists of a list of the collection's elements in the
 * order they are returned by its iterator, enclosed in square brackets
 * (<tt>"[]"</tt>).  Adjacent elements are separated by the characters
 * <tt>", "</tt> (comma and space).  Elements are converted to strings as
 * by {@link String#valueOf(Object)}.
 *
 * @return a string representation of this collection
 */
public String toString() {
    Iterator<E> it = iterator();
    if (! it.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = it.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! it.hasNext())
            return sb.append(']').toString();
        sb.append(',').append(' ');
    }
}
于 2012-12-08T18:23:26.203 に答える
-1

array toString()メソッドの場合、メモリアドレスを出力します。しかし、 このクラスではtoString()メソッドをArrayListオーバーライドします。Object

ArrayList の toString() 実装

   public String toString() {
    Iterator<E> i = iterator();
    if (! i.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = i.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! i.hasNext())
        return sb.append(']').toString();
        sb.append(", ");
    }
}
于 2012-12-08T18:23:23.027 に答える