# List versus ArrayList



## Wolfgang Lenhard (29. Mrz 2009)

Hi,
eine grundlegende Verständnisfrage. Wieso wird in der Regel in Handbüchern Folgendes geschrieben:

```
List<String> list = new ArrayList<String>();
```

Wieso schreibt man nicht:

```
ArrayList<String> list = new ArrayList<String>();
```


Ciao,
   Wolfgang


----------



## André Uhres (29. Mrz 2009)

Weil Bloch* sagt: "Refer to objects by their interfaces" 

*Joshua Bloch, US-amerikanischer Softwareingenieur und Autor; Chief Java Architect bei Google


----------



## FatFire (29. Mrz 2009)

Und für die, die Google mißtrauen gibt es natürlich auch eine logische Erklärung: uns interessieren in der OOP nur die Funktionalitäten, nicht die Implementierungen. Daher versuchen wir auch nur mit den Schnittstellen zu arbeiten, die uns die Funktionalitäten garantieren, denn Schnittstellen ändern sich nicht so schnell wie die dahinterstehenden Implementierungen.

Gruß FatFire


----------



## Geeeee (29. Mrz 2009)

"Effective Java" würde ich nun nicht mit "Google vertrauen" gleichsetzten 
Hier mal ein minimales Beispiel, woran du erkennen kannst, welche Vorteile du hast:
Direkt mit ArrayList:
[HIGHLIGHT="Java"]
public static void main(String... args) {
        ArrayList<String> liste =getListe();
    }

    public static ArrayList<String> getListe() {
        return new ArrayList<String>();
    }
[/HIGHLIGHT]
Es ist dort nicht möglich z.B. getListe() mit einem List<String> ohne Cast zu returnen. Ein Cast würde hier noch gehen, aber schon Typ-"Unsicherheit" begünstigen. Wenn du nun folgendes machst:
[HIGHLIGHT="Java"]
public static void main(String... args) {
        List<String> liste =getListe();
    }

    public static List<String> getListe() {
        return new ArrayList<String>();
// return new LinkedList<String();
// return ... anyImplementation of List
    }
[/HIGHLIGHT]
Kannst du in der getListe()-Methode auch mit LinkedList etc. arbeiten, ohne dass du irgendwas an den anderen (nicht in diesem Beispiel-vorhandenen) Methoden anpassen müsstest.


----------



## André Uhres (29. Mrz 2009)

Ja, Bloch hat natürlich auch logische Erklärungen (und hatte er wahrscheinlich schon ehe er zu Google kam). Beispiel:
_If you decide that you want to switch implementations, all you have to do is change the class name in the constructor:_

```
List<String> list = new Vector<String>();
```
_and all of the surrounding code would continue to work..._


----------



## SlaterB (29. Mrz 2009)

siehe auch
http://www.java-forum.org/java-basics-anfaenger-themen/79539-unterschiedliche-initialisierungen.html


----------



## Wolfgang Lenhard (29. Mrz 2009)

Ok, alles klar. Danke für die vielen Antworten!


----------

