2011-01-04 10 views

Antwort

10

Keine, aus einer Schöpfungsperspektive. Beide erstellen eine Instanz von ArrayList.

Der Unterschied ist, dass in ihrem zweiten Beispiel ermöglicht al Zugriff auf alle auf der List Schnittstelle während implementierten Methoden, im ersten Beispiel ermöglicht al Zugriff auf alle (barrierefrei) Methoden und Felder der ArrayList Klasse.

Eine praktische Faustregel: Verwenden Sie das zweite Muster. Wenn Sie einige zusätzliche Goodies aus der ArrayList Implementierung benötigen, dann können Sie immer Stimmen:

List list = new ArrayList(); 
// do some adds/removes/... on the list 
((ArrayList) list).trimToSize(); 
+0

Thnk u abdreas D aber 1 Sache, was ist die Faustregel? –

+0

@Hari kanna - Verwenden Sie einen Schnittstellentyp, falls verfügbar, so 'List' oder sogar' Collection'. Das mache ich in 99,5% aller Fälle. –

7

Seine prog genannt Rammen zur Schnittstelle. Angenommen, Sie müssen diese list von Ihrer Methode zurückgeben. So kann der aufrufende Code das in eine List Variable haben.

public ArrayList getList() { 
    ArrayList list = new ArrayList(); 
    // do something with the list here 
    return list; 
} 

Und das

public List getList() { 
    List list = new ArrayList(); 
    // do something with the list here 
    return list; 
} 

Jetzt für die letztere Methode aufrufen Code kann die zurückgegebene Liste in List Typ Variable haben. Und Sie können leicht später entscheiden, aus irgendeinem Grund, so etwas wie dieses,

public List getList() { 
    List list = new LinkedList(); 
    // do something with the list here 
    return list; 
} 

Keine Änderung Code in Berufung, während mit dem ehemaligen müssen Sie den Rückgabetyp ändern, die schließlich die Berufung Code vermasseln würde auch .

+0

PLZ erklären im Detail –

+4

@Hari Kanna: Ich habe gerade das getan :). –

7

paraphrasiert my answer-this very similar question über Map vs. HashMap:

Es gibt keinen Unterschied zwischen den Objekten. Es gibt einen Unterschied in der Schnittstelle Sie haben das Objekt. Im ersten Fall ist das Interface ArrayList, während es im zweiten Fall List ist. Das zugrunde liegende Objekt ist jedoch das gleiche.

Der Vorteil der Verwendung von List ist, dass Sie das zugrunde liegende Objekt als eine andere Art von Liste ändern können, ohne Ihren Vertrag mit irgendeinem Code zu brechen, der es verwendet. Wenn Sie es als ArrayList deklarieren, müssen Sie Ihren Vertrag ändern, wenn Sie die zugrunde liegende Implementierung ändern möchten.

+0

Ah, und es stellte sich heraus, dass es ein genaues Duplikat mit "List" gab. :-) –