# unterschied list und arraylist?



## dermoritz (21. Mai 2008)

theoretisch weiß ich glaub den unterschied: arraylist ist eine konkrete implementierung von list. Aber praktisch raff ich das nicht.
Wofür sollte man sich auf z.B ArrayList festlegen wenn doch List reicht? Also warum überhaupt ArrayList verwenden. Praktisch funktioniert das ja nicht ohne weiteres: Collection<T> liste=new List<T>; funzt ja nicht oder?

jetzt frag ich mich aber wie bestimmte methoden als ergebnis eine List zurückgeben (z.b. diverse jdom methoden) können bzw. wie implementiert man sowas.
Also ich hätte gern ein Methode die eine List zurückgibt und eben nicht eine ArrayList.

Es geht hier tatsächlich nicht um das Lösen eines konkreten Problems sondern vielmehr um eine Verständnisfrage.

und noch eine ähnlich gelagerte frage:
wo ist der praktische unterschied zwischen:

Collection<T> liste=new ArrayList<T>;
List<T> liste=new ArrayList<T>;


----------



## SlaterB (21. Mai 2008)

Ein Autohändler kann behaupten, dass er Autos verkauft/ dass bei einem seiner Geschäfte genau ein Auto den Besitzer wechselt.
Trotzdem kann man dieses Auto nicht anfassen, es ist entweder ein Mercedes Typ X oder ein VW Typ Y.
'Auto' ist hier nur ein allgemeiner Begriff, der an bestimmten Stellen Sinn macht.

Genau wie ein Interface in Java nicht als Objekt erzeugt werden kann,
aber trotzdem kann es als Rückgabewert einer Operation verwendet werden.
Das heißt, dass irgendeine Liste zurückgegeben wird, sei es ArrayList oder eine andere.


----------



## hupfdule (21. Mai 2008)

Du hast das schon richtig erkannt.
ArrayList ist eine konkrete Implementierung, während List halt nur die Schnittstelle definiert.



> Wofür sollte man sich auf z.B ArrayList festlegen wenn doch List reicht? Also warum überhaupt ArrayList verwenden. Praktisch funktioniert das ja nicht ohne weiteres: Collection<T> liste=new List<T>; funzt ja nicht oder?



Richtig, eben weil List keine Klasse ist. Du brauchst eine Klasse, die das List-Interface implementiert. Welche das ist, ist erst mal egal. Und das wichtige: Jede Implementierung verhält sich nach außen hin gleich, da sie alle als List auftreten.
Die Frage ist jedoch nicht List oder ArrayList, sondern ArrayList oder LinkedList oder Stack oder ....
Welche davon du nimmst, ist abhängig von der Nutzungsweise der List. Im Zweifelsfall ist ArrayList schon die richtige Wahl.



> jetzt frag ich mich aber wie bestimmte methoden als ergebnis eine List zurückgeben (z.b. diverse jdom methoden) können bzw. wie implementiert man sowas.
> Also ich hätte gern ein Methode die eine List zurückgibt und eben nicht eine ArrayList.



Das geht quasi automatisch. Statt 
	
	
	
	





```
public ArrayList getList(){
    return new ArrayList();
}
```
schreibst du halt

```
public List getList(){
    return new ArrayList();
}
```

Der Unterschied ist nur in der Signatur. Dem Benutzer deiner Methode ist also die tatsächliche Implementierung egal. Wichtig ist nur, dass er eine List bekommt.



> Collection<T> liste=new ArrayList<T>;
> List<T> liste=new ArrayList<T>;



Collection ist etwas rudimentärer als List. List ist eine geordnete Liste, auf die du auch wahlfrei zugreifen kannst. Eine Collection ist nur eine Sammlung von Objekten in beliebiger Reihenfolge, die du mit einem Iterator durchlaufen kannst.

Wenn du weißt, dass du eine Reihenfolge in deiner Liste brauchst, dann gib sie als List zurück.


----------



## Beni (21. Mai 2008)

Vielleicht hilft auch ein anderes Beispiel:

Collection = Nahrung
List = Frucht
ArrayList = Apfel
LinkedList = Banane

Du kannst niemals eine "Frucht" einfach so erstellen, aber du kannst einen Apfel mit "Frucht" anschreiben. Und jede Frucht ist natürlich auch Nahrung.

Ein unbekanntes Projekt könte jetzt auch noch weitere Früchte einbringen...


----------



## dermoritz (21. Mai 2008)

danke,


aber wie funktioniert das praktisch, wie sieht eine methode aus die eine List zurückgibt. Kann eine List auch ein Attribut einer Klasse sein? ich kann ja keine new List machen und sie füllen. wie machen das diese Methoden?
Die müssen doch auch ein Objekt erzeugen und es füllen?

mich hat halt verwirrt, dass es solche Methoden gibt aber ich gleichzeitig ich sowas nicht (so einfach) nachbauen kann.


----------



## Beni (21. Mai 2008)

Solche eine Methode ist ganz einfach:

```
public List<String> etwas(){
  List<String> list = new LinkedList<String>();
  list.add( "a" );
  list.add( "b" );
  return list;
}
```


----------



## dermoritz (21. Mai 2008)

danke das bringt licht ins dunkel.

das heißt jede methode die etwas abstraktes wie List oder Collection zurückgibt benutzt intern eine konkrete Implementierung?

Welchen Vorteil hat es din so einem Fall eigentlich eine List zurückzugeben und eben nicht z.b. eine LinkedList wie in deinem Beispiel?
Und wann und warum könnte man eine Collection zurückgeben?


----------



## cburghardt (21. Mai 2008)

dermoritz hat gesagt.:
			
		

> danke das bringt licht ins dunkel.
> 
> das heißt jede methode die etwas abstraktes wie List oder Collection zurückgibt benutzt intern eine konkrete Implementierung?


Jawollja.



			
				dermoritz hat gesagt.:
			
		

> Welchen Vorteil hat es din so einem Fall eigentlich eine List zurückzugeben und eben nicht z.b. eine LinkedList wie in deinem Beispiel?


Weil du die Implementierung dann intern auch noch nachträglich ändern kannst, ohne dass sich die Aufrufer darum kümmern müssten. Wenn du als Rückgabewert ArrayList definierst und plötzlich feststellst, dass deine Liste die Eigenschaften von Vector braucht, würde das nicht gehen. Aber wenn du List zurückgibst, ist das kein Problem.


----------



## SlaterB (21. Mai 2008)

insbesondere sollte der Aufrufer auch gar nicht wissen müssen, welche Liste da nun genau kommt,
ein Datenbank-Treiber könnte irgendeine verrückte interne Listen-Spezial-Implementierung verwenden,
eine Klasse die nicht mal public ist, die die Aufrufer gar nicht importieren kann


----------



## maki (21. Mai 2008)

SlaterB hat gesagt.:
			
		

> insbesondere sollte der Aufrufer auch gar nicht wissen müssen, welche Liste da nun genau kommt,
> ein Datenbank-Treiber könnte irgendeine verrückte interne Listen-Spezial-Implementierung verwenden,
> eine Klasse die nicht mal public ist, die die Aufrufer gar nicht importieren kann


Hibernate zB. macht genau das mit zB. Set (und List?), implementiert eine eigene Version.


----------



## SlaterB (21. Mai 2008)

ich schreib ja auch nur ab was ich selber gemerkt habe und denk mir das nicht aus


----------



## Guest (21. Mai 2008)

vielen dank an alle!

nun hab ich wieder etwas dazugelernt/ verstanden


----------

