web-dev-qa-db-fra.com

Pourquoi la méthode toString () fonctionne différemment entre les objets Array et ArrayList dans Java

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

Pour list[a, b, c] Est sortie tandis que pour array une adresse est sortie. Lorsque nous voulons afficher les valeurs array, nous pouvons utiliser Arrays.toString(array); qui fonctionne exactement comme list.

Je me demande simplement pourquoi nous ne pouvons pas appeler toString() directement sur array pour obtenir les valeurs. N'est-il pas plus intuitif et pratique de le faire? Quels sont les résultats des différents traitements sur Array et ArrayList?

14
Terry Li

La principale différence entre un tableau et un tableau est qu’un tableau est une classe qui est écrite en Java et a sa propre implémentation (y compris la décision de remplacer toString) tandis que les tableaux font partie de la spécification du langage elle-même. En particulier, le JLS 10.7 déclare:

Les membres d'un type de tableau sont tous les suivants:

  • La longueur finale du champ public
  • La méthode publique clone, qui remplace la méthode du même nom dans la classe Object et ne renvoie aucune exception vérifiée.
  • Tous les membres hérités de la classe Object; la seule méthode d'Object qui n'est pas héritée est sa méthode de clonage.

En d'autres termes, la spécification du langage empêche la méthode toString d'un tableau d'être remplacée et utilise donc l'implémentation par défaut définie dans Object qui affiche le nom de la classe et le code de hachage.

Pourquoi cette décision a été prise est une question qui devrait probablement être posée aux concepteurs de la langue ...

15
assylias

Je me demande simplement pourquoi nous ne pouvons pas appeler toString () directement sur le tableau pour obtenir les valeurs.

En fait, la méthode toString est appelée sur l'objet tableau. Mais, puisque le type de tableau ne remplace pas la méthode toString de la classe Object, l'implémentation par défaut de toString est invoquée, ce qui renvoie la représentation du formulaire que vous voyez.

La représentation est de la forme: -

[typeOfArray@hashCode

Dans votre cas, c'est quelque chose comme: -

[Ljava.lang.String;@3e25a5

Alors que, dans le cas d'instances ArrayList, la méthode toString remplacée dans la classe ArrayList est invoquée.

4
Rohit Jain

La réponse courte est parce que toString est défini à quelques endroits différents, avec des comportements différents.

La classe Arrays définit toString comme une méthode statique, à invoquer comme

Arrays.toString(arr_name);

Mais la classe Arrays hérite également de la méthode non statique toString de la classe Object. Ainsi, s'il est appelé sur une instance, il invoque Object.toString qui renvoie une représentation sous forme de chaîne de l'objet (par exemple: [Ljava.lang.Object; @ 4e44ac6a)

Ainsi, Arrays.toString () et MyObject.toString () appellent des méthodes différentes avec le même nom.

La classe ArrayList hérite de toString de la classe AbstractCollection, où il s'agit d'une méthode non statique, elle peut donc être appelée sur l'objet comme:

MyArrayList.toString();

Puisqu'il s'agit d'une représentation sous forme de chaîne d'une collection et non d'un objet, le résultat est les valeurs dans un format lisible comme [un, deux].

3
danf

Parce que lorsque vous imprimez toString(), il imprime par défaut className@HashCode.

Ainsi, lorsque vous imprimez array, ce qui précède sera imprimé.

Mais ArrayList est étendu par la classe AbstractCollection et où la méthode toString() est remplacée comme ci-dessous

 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(' ');
        }
    }

qui imprime le format lisible de l'objet ArrayList.

0
Bhavik Ambani

Il s'agit de l'appel de méthode toString pour ArrayList. Mais pour les tableaux, vous ne pouvez pas en trouver.

 /**
 * 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(' ');
    }
}
0
Suranga