2012-12-08 19 views
10
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); 

Für list[a, b, c] unterschiedlich zwischen Array und Arraylist-Objekt arbeitet ausgegeben, während für array einige Adresse ausgegeben wird. Wenn wir die Werte array ausgeben wollen, können wir Arrays.toString(array); verwenden, was genauso funktioniert wie list.Warum Methode toString() in Java

Ich frage mich nur, warum wir toString() nicht direkt auf array aufrufen können, um die Werte zu erhalten. Ist das nicht intuitiver und bequemer? Was führt zu den verschiedenen Behandlungen auf Array und ArrayList?

Antwort

11

Der Hauptunterschied zwischen einem Array und einer Arraylist besteht darin, dass eine Arraylist eine Klasse ist, die in Java geschrieben ist und eine eigene Implementierung hat (einschließlich der Entscheidung toString zu überschreiben), während Arrays Teil der Sprachspezifikation sind. Insbesondere sind die JLS 10.7 Zustände:

Die Mitglieder eines Array-Typ sind alle der folgenden:

  • Die public final Feldlänge
  • Der öffentliche Methode Klon, der das Verfahren nach der überschreibt Derselbe Name in der Klasse Object und wirft keine aktivierten Ausnahmen.
  • Alle Mitglieder geerbt von der Klasse Object; Die einzige Methode von Object, die nicht geerbt wird, ist ihre Klonmethode.

Mit anderen Worten: die Sprachspezifikation verhindert die toString Methode eines Arrays außer Kraft gesetzt werden, und es nutzt daher die Implementierung Standard in Object definiert, die die Klassennamen und hashcode druckt.

Warum diese Entscheidung getroffen wurde, eine Frage ist, die wahrscheinlich zu den Designern der Sprache gestellt werden soll ...

+0

Siehe auch [diese Antwort] (http://stackoverflow.com/a/10295995/829571). – assylias

4

Ich frage mich nur, warum wir toString() nicht direkt auf Array aufrufen können, um die Werte zu erhalten.

Tatsächlich toString Methode wird für das Array-Objekt aufgerufen. Da jedoch der Array-Typ die toString-Methode von Object nicht überschreibt, wird die Standardimplementierung von toString aufgerufen, die die Darstellung des angezeigten Formulars zurückgibt.

Die Darstellung der Form ist: -

[[email protected] 

In Ihrem Fall ist es so etwas wie: -

[Ljava.lang.String;@3e25a5 

Während im Fall von ArrayList Fällen die außer Kraft gesetzt toString Methode in ArrayList Klasse aufgerufen.

0

Da beim Drucken toString(), wird es von Standard-Druck [email protected].

So, wenn Sie array drucken dann wird oben gedruckt werden.

Aber ArrayList durch AbstractCollection Klasse extened und wo die toString() Methode wie unten

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

außer Kraft gesetzt wird, die das lesbare Format des ArrayList Objekts druckt.

-1

Für arraytoString() Methode druckt es die Speicheradresse. Aber in ArrayList überschreibt diese Klasse ObjecttoString() Methode.

toString() Umsetzung Array

0

Dies ist der toString Methodenaufruf für Arraylist. Aber für Arrays kann man so etwas nicht finden.

1

Die kurze Antwort ist, weil toString in einigen verschiedenen Orten mit unterschiedlichen Verhaltensweisen definiert ist.

Die Arrays Klasse toString als statische Methode definiert, werden aufgerufen, wie

Arrays.toString(arr_name); 

Aber die Arrays Klasse erbt auch die nicht-statische Methode toString aus der Objektklasse. Wenn also eine Instanz aufgerufen wird, ruft sie Object.toString auf, das eine Zeichenfolgendarstellung des Objekts zurückgibt (z. B .: [Ljava.lang.Object; @ 4e44ac6a)

Also Arrays.toString() und MyObject.toString() sind verschiedene Methoden mit demselben Namen aufrufen.

Die Arraylist-Klasse erbt toString von der Abstract Klasse, wo es eine nicht statische Methode ist, so kann auf dem Objekt wie aufgerufen werden:

MyArrayList.toString(); 

Weil es eine String-Darstellung einer Sammlung und kein Objekt Das Ergebnis sind die Werte in einem lesbaren Format wie [eins, zwei].

Verwandte Themen