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