# Wozu braucht man array list?



## FrageAnDAsForum (12. Jul 2012)

Wofür genau braucht man array list? Ich weiss, sie sind das gleiche wie arrays, aber sie können neue sachen aufnehmen und löschen. Doch ich verstehe nicht wann genau ich es brauchen kann...?


----------



## Gast2 (12. Jul 2012)

Ein Array hat eine feste Größe die du nach dem Erstellen nichtmehr verändern kannst. Wenn du im vornherein nicht weißt wieviele Element dein Container aufnehmen muss bietet sich ne ArrayList an.


----------



## julian.veh (12. Jul 2012)

zum Beispiel um Objekte in ihr zu lagern, auf die du hinterher noch zugreifen willst. Zum Beispiel in einem Telefonbuch Kontakte, da kommen immer mehr Objekte der Klasse 
	
	
	
	





```
Kontakt
```
 hinzu.

gruß


----------



## hüteüberhüte (12. Jul 2012)

Arrays bieten ja einen direkten Zugriff auf ihre Elemente. ArrayList bietet ebenfalls diesen Vorteil, zusammen damit, dass sich das Feld auch vergrößern lässt

[1]: Java Collections


> public class ArrayList
> extends AbstractList
> implements List, Cloneable, Serializable
> 
> ...



[2]: Lesson: Introduction to Collections (The Java™ Tutorials > Collections)


> A collection — sometimes called a container — is simply an object that groups multiple elements into a single unit. Collections are used to store, retrieve, manipulate, and communicate aggregate data. Typically, they represent data items that form a natural group, such as a poker hand (a collection of cards), a mail folder (a collection of letters), or a telephone directory (a mapping of names to phone numbers).



Mehr darüber, _warum_ es Collections gibt, habe ich jetzt nicht gefunden. Aber denke mal, der wesentliche Punkt ist klar: um mehrere Element zusammenzufassen zu können (ein 'zu' zu viel?  )


----------



## hüteüberhüte (12. Jul 2012)

[OT]"zusammenzufassen zu können" tauchte wirklich bereits schon einmal im Netz auf:


> Erstellen eines Suchordners für wichtige E-Mail-Nachrichten
> 
> Sie können schnell nach allen wichtigen Nachrichten suchen. In Outlook werden wichtige Nachrichten durch Wichtigkeit: HochSchaltflächensymbol gekennzeichnet. Verwenden Sie einen Suchordner, um diese Nachrichten zusammenzufassen und immer problemlos finden zu können.


 - Zusammenfassen von Nachrichten mithilfe von Suchordnern - Outlook - Office.com

Aber vielleicht wurde auch nur eine automatische Übersetzung verwendet [/OT]


----------



## André Uhres (12. Jul 2012)

ArrayList ist die bevorzugte Collection, wenn man keine besonderen Ansprüche stellt. Wenn es aber zum Beispiel keine Duplikate geben soll, würde man eher ein Set wählen. Oder wenn man Schlüssel-Wert Paare braucht, würde man eher zu einer Map greifen...

Gruß,
André


----------



## faetzminator (12. Jul 2012)

Normalerweise verwendet man nie Arrays - auch wenn man z.B. eine Schnittstellendefinition [c]People[0..10][/c] hat, erstellt man kein [c]People[10][/c], sondern eine [c]List<People>[/c].

Edit: Ausnahmen natürlich: die Implementierung solcher ArrayLists etc. selber, aufwändige mathematische Dinge (primitive Typen und Arrays sind ein vielfaches schneller) und Übungsbeispiele von Schulen


----------



## AquaBall (12. Jul 2012)

ALso ich nehm immer Arrays, wenn im Vorhinein weiß wieviel Elemente es gibt.

Bei jedem Spiel/Raster: schachBrett[8][8];
Arbeitseinteilung: personalEinteilung[ARBEITSTAGE][ÖFFNUNGSSTUNDEN];
sogar im chaotischen Lager: regal[MAXNR];
...


----------



## Gast2 (12. Jul 2012)

AquaBall hat gesagt.:


> ALso ich nehm immer Arrays, wenn im Vorhinein weiß wieviel Elemente es gibt.
> 
> Bei jedem Spiel/Raster: schachBrett[8][8];
> Arbeitseinteilung: personalEinteilung[ARBEITSTAGE][ÖFFNUNGSSTUNDEN];
> ...



Das sind aber wenn du ehrlich bist doch eher die Ausnahmen. 

Meistens speichert man in LIsten doch Veränderliche Anzahl von Elementen (z.B. Listener, Einträge, ...)


----------



## Korashen (12. Jul 2012)

kappesf hat gesagt.:


> Das sind aber wenn du ehrlich bist doch eher die Ausnahmen.
> 
> Meistens speichert man in LIsten doch Veränderliche Anzahl von Elementen (z.B. Listener, Einträge, ...)



Ich würde das nicht als Ausnahme bezeichnen.
Wenn du zB eine Datenbankabfrage durchführst und das Ergebnis in ein Array packen willst, weißt du genau, wieviele Objekte das 
	
	
	
	





```
ResultSet
```
hat und damit, wie groß dein Array sein muss.

Und bezüglich "Warum ein Array, wenn ich doch ein ResultSet habe?":
Vielleicht ist das Array nur als Zweitinfo gedacht, für eine Übersichtsliste zB, während das ResultSet die gesamten Daten enthält.
(Um beim Beispiel Telefonbuch zubleiben, das RS hat alle Daten, das Array nur die Nachnamen, oder sowas in der Art.)


[Edit1]
Was mal interessant wäre, ein paar Standardoperationen auf ein Array ausführen und dann gleiche/ähnliche Operationen auf eine Arrayliste. Und dann die Class-Datei decompilieren und schauen, was der Compiler so daraus gemacht hat.


----------



## bygones (12. Jul 2012)

Korashen hat gesagt.:


> Ich würde das nicht als Ausnahme bezeichnen.
> Wenn du zB eine Datenbankabfrage durchführst und das Ergebnis in ein Array packen willst, weißt du genau, wieviele Objekte das
> 
> 
> ...


kannst auch in eine Collection packen....



Korashen hat gesagt.:


> Edit1
> Was mal interessant wäre, ein paar Standardoperationen auf ein Array ausführen und dann gleiche/ähnliche Operationen auf eine Arrayliste. Und dann die Class-Datei decompilieren und schauen, was der Compiler so daraus gemacht hat.


na dann fuehr mal n paar Standardoperationen auf einen Array aus.....

ansonsten schau dir einfach die implementierung von ArrayList an, dann siehste was da passiert


----------



## Korashen (12. Jul 2012)

bygones hat gesagt.:


> kannst auch in eine Collection packen....
> 
> 
> na dann fuehr mal n paar Standardoperationen auf einen Array aus.....
> ...



Es geht mir weniger darum, was passiert, sondern viel mehr, was der Compiler mit meinem Quellcode anstellt.
So wie ja Standard-String-Operationen bereits mit einem StringBuilder-Objekt ausgetauscht werden ;-)


----------



## bygones (12. Jul 2012)

Korashen hat gesagt.:


> Es geht mir weniger darum, was passiert, sondern viel mehr, was der Compiler mit meinem Quellcode anstellt.
> So wie ja Standard-String-Operationen bereits mit einem StringBuilder-Objekt ausgetauscht werden ;-)


was sind denn Standard Operationen fuer dich ? 
anscheinend [c]String s = "Hello" + "World"[/c], bei allen Api methoden von String kannst du nachschauen wie dies geschieht.

meine Aussage war daraufbezogen, dass diese "StandardOperationen" bei Arrays mehr als begrenzt sind, so im Sinne von nicht vorhanden - und wie gesagt - Api methoden (bzw implementierung) einfach in der Klasse nachschauen.


----------



## Claudia92 (12. Jul 2012)

faetzminator hat gesagt.:


> Normalerweise verwendet man nie Arrays - auch wenn man z.B. eine Schnittstellendefinition [c]People[0..10][/c] hat, erstellt man kein [c]People[10][/c], sondern eine [c]List<People>[/c].


Hmm, warum das?
Sofern es sich um eine im Voraus bekannte und unveränderliche Anzahl an Elementen handelt, bietet eine List doch keine Vorteile mehr - oder übersehe ich da etwas?


----------



## Korashen (12. Jul 2012)

bygones hat gesagt.:


> was sind denn Standard Operationen fuer dich ?
> anscheinend [c]String s = "Hello" + "World"[/c], bei allen Api methoden von String kannst du nachschauen wie dies geschieht.
> 
> meine Aussage war daraufbezogen, dass diese "StandardOperationen" bei Arrays mehr als begrenzt sind, so im Sinne von nicht vorhanden - und wie gesagt - Api methoden (bzw implementierung) einfach in der Klasse nachschauen.



Eine Standardoperation eines Arrays wäre für mich zum Beispiel das Speichern eines Objekts in einem Array:

```
String namen[] = new String[10];
namen[0] = "Holger";
System.out.println(namen[0]);
```

Im Gegensatz dazu die Arraylist:

```
List<String> namen = new ArrayList<String>();
namen.add("Holger");
System.out.println(namen.get(0));
```

Beide Codeschnipsel machen im Grunde das gleiche, sind also durchaus miteinander austauschbar.
Mein Gedanke nun, ob der Compiler es vllt. sogar schon austauscht, wie er es bei Strings macht.

Und ich habe eben nachgeschaut, nein, der Compiler tauscht nichts aus, es steht im Bytecode so wie es ist.


----------



## faetzminator (12. Jul 2012)

AquaBall hat gesagt.:


> Bei jedem Spiel/Raster: schachBrett[8][8];


Davon ausgegangen, dass du eine Klasse "Schachbrett" (wer schreibt eigentlich deutschen Code?) hast, welche intern ein zweidimensionales Array besitzt, lass ich aber wieder diese Regel gelten:


> Ausnahmen natürlich: die Implementierung solcher ArrayLists etc. selber





AquaBall hat gesagt.:


> Arbeitseinteilung: personalEinteilung[ARBEITSTAGE][ÖFFNUNGSSTUNDEN];



Warum nicht einfach objektorientiert Arbeiten :noe: ;(


----------



## schalentier (12. Jul 2012)

@Korashen: Die analoge Implementierung mit einer ArrayList saehe so aus:


```
List<String> namen = new ArrayList<String>(10);
namen.set(0, "Holger");
System.out.println(namen.get(0));
```


----------



## AquaBall (12. Jul 2012)

faetzminator hat gesagt.:


> Davon ausgegangen, dass du eine Klasse "Schachbrett" (wer schreibt eigentlich deutschen Code?) hast, welche intern ein zweidimensionales Array besitzt, lass ich aber wieder diese Regel gelten: Ausnahme!
> ...
> Warum nicht einfach objektorientiert Arbeiten :noe: ;(



[OT]Was hat die Sprache mit der Frage zu tun? 
(Danke, dass du dich wenigstens hier dazu herablässt, mit uns Warmduschern deutsch zu sprechen.)
[/OT]Was hindert ein Array Objekte aufzunehmen?

Deine Aussage war "Normalerweise verwendet man nie Arrays" - 
"auch wenn man z.B. eine Schnittstellendefinition People[0..10] hat, erstellt man kein People[10]"
Das halte ich für puren Nonsense.

Wenn ich eine fixe Anzahl von Elementen (auch Objekte genannt) habe, dann ist das gute alte Array sicher noch das performateste und auch von der Code-lesbarkeit das sicherste.
Wenn ich einen Parkplatz mit 10 Parkplätzen habe, dann mach ich ein array: 

```
Car[] parkingsite = new Car[MAXSITES];  // (Englisch, damit es auch Nicht-Warmduscher lesen können.)
```
Dann kann mir gar nicht passieren, dass mit add() ein nicht vorhandener Platz vergeben werden könnte.


----------



## buzz!dev (12. Jul 2012)

@korashen: Und was glaubst du passiert bei einer ArrayList im Hintergrund? Schwarze Magie?
new ArrayList() macht nichts anderes als ein Array elementData der Länge 10 anzulegen
.add(x) entspricht einem elementData[size++] = x;
und .get(0) ist - oh Wunder! - return elementData[index];
Abgesehen von der Generizität und der dynamischen Größe des Arrays ist da nicht viel dahinter.

Die von dir und schalentier geschriebenen Codeausschnitte sind deswegen nicht vergleichbar, weil sie logisch etwas komplett anderes machen. oO


----------



## bygones (12. Jul 2012)

AquaBall hat gesagt.:


> Wenn ich eine fixe Anzahl von Elementen (auch Objekte genannt) habe, dann ist das gute alte Array sicher noch das performateste und auch von der Code-lesbarkeit das sicherste.


performanz duerfte sich so ziemlich im "sowas-von-wurscht" bereich eher befinden. Code lesbarkeit ? mhm... ein einfaches [c]add[/c], [c]remove[/c], [c]indexOf[/c], [c]contains[/c] etc sind mit einem Array meiner ansicht nach NICHT besser lesbar.

Fakt ist - dank Abstraktion hat man bei Collection/Listen eine API mit der man arbeiten kann. Ich persoenlich finde das nutzen einer API immer besser als keine zu haben. Und das Performanzargument ist so und so meist ein scheinbares Argument.

Das mit der FixedSized waere noch ok - aber auch da wuerde ich dann eher eine entsprechende Collection implementierung vorziehen.


----------



## hüteüberhüte (12. Jul 2012)

Es ging hier doch um die Vorteile speziell von ArrayList

1. Elemente werden in einem Array gespeichert, d.h. es gibt einen schnellen Zugriff
2. Wenn nicht genügend Platzt zur Verfügung steht, wird das Array vergrößert und Elemente kopiert

Nicht mehr und nicht weniger macht eine ArrayList aus

Bytecode zu de-kompilieren, um zu sehen, wie ArrayList intern funktioniert, bringt rein gar nichts


----------



## faetzminator (13. Jul 2012)

AquaBall hat gesagt.:


> Deine Aussage war "Normalerweise verwendet man nie Arrays" -
> "auch wenn man z.B. eine Schnittstellendefinition People[0..10] hat, erstellt man kein People[10]"
> Das halte ich für puren Nonsense.



Dann sind wir aber irgendwie bei C o.ä. angelangt, bei welchem ich dann [c]People[] people, int size[/c] aufrufe, denn es könnten auch nur 8 oder wie viele auch immer sein. Ausser man macht natürlich einen [c]null[/c]-Check, was auch wieder "Mehraufwand" ist.
Zusätzlich gibts da auch keine hübsche Methode [c]clear()[/c] oder [c]putAll()[/c] etc.


----------



## mla.rue (13. Jul 2012)

faetzminator hat gesagt.:


> Davon ausgegangen, dass du eine Klasse "Schachbrett" (wer schreibt eigentlich deutschen Code?) ...(



z.B. ich
bei einfachen Sachen wie Name, Vorname, Geburtstag, Geschlecht, Titel, Straße, Rezept, DKM gehts noch.
Lustiger wird wenn man so Sachen wie Untersuchender Arzt, Behandelnder Arzt, Hausarzt, Überweisender Arzt, Arzei, Arzeimittel, Medikament, Medikation, Behandlung...  hat. Ehe man sich versieht, hat man paar Dutzend Variablen, die im Englischen irgendwie alle gleich klingen und ist man am Ende angekommen, weiss man nicht mehr, was man am Anfang genommen hat.


----------



## maki (13. Jul 2012)

mla.rue hat gesagt.:


> z.B. ich
> bei einfachen Sachen wie Name, Vorname, Geburtstag, Geschlecht, Titel, Straße, Rezept, DKM gehts noch.
> Lustiger wird wenn man so Sachen wie Untersuchender Arzt, Behandelnder Arzt, Hausarzt, Überweisender Arzt, Arzei, Arzeimittel, Medikament, Medikation, Behandlung...  hat. Ehe man sich versieht, hat man paar Dutzend Variablen, die im Englischen irgendwie alle gleich klingen und ist man am Ende angekommen, weiss man nicht mehr, was man am Anfang genommen hat.


.. und bekommt dann ganz tolles Denglisch...  *schauder*

Bei proffessioneller SW Entwicklung nimmt man engl. Bezeichner, mit sehr seltenen Ausnahmen.


----------



## nillehammer (13. Jul 2012)

maki hat gesagt.:
			
		

> Bei proffessioneller SW Entwicklung nimmt man engl. Bezeichner, mit sehr seltenen Ausnahmen.


Sehe ich genau so! Im Englischen gibt es z.B. auch keine bloeden deutschen Umlaute, wo man dann bspw. ueberweisenderArtzt schreiben muesste.


----------



## bygones (13. Jul 2012)

maki hat gesagt.:


> .. und bekommt dann ganz tolles Denglisch...  *schauder*
> 
> Bei proffessioneller SW Entwicklung nimmt man engl. Bezeichner, mit sehr seltenen Ausnahmen.



ich wiederhole mich immer gerne - bei entwicklung fuer dt. kunden in einem dt. Team sehe ich keinen Sinn in englisch zu entwickeln - ansonsten stimme ich zu


----------



## hüteüberhüte (13. Jul 2012)

[OT]





nillehammer hat gesagt.:


> Sehe ich genau so! Im Englischen gibt es z.B. auch keine bloeden deutschen Umlaute, wo man dann bspw. ueberweisenderArtzt schreiben muesste.



Gut, daß man diese im Code schreiben darf, auch wenn sie nicht gern gesehen sünd [/OT]


----------



## AquaBall (13. Jul 2012)

nillehammer hat gesagt.:


> Sehe ich genau so! Im Englischen gibt es z.B. auch keine bloeden deutschen Umlaute, wo man dann bspw. ueberweisenderArtzt schreiben muesste.



Gut, dass man das auf deutsch nicht einmal mit Umlauten müsste!


----------



## collection (13. Jul 2012)

hüteüberhüte hat gesagt.:


> Bytecode zu de-kompilieren, um zu sehen, wie ArrayList intern funktioniert, bringt rein gar nichts


Bytecode de-komp... was? 

Vielleicht bringt es dir noch nichts, die Sources der Collection anzusehen, aber irgendwann kommt der Punkt, an dem du wissen willst, womit du da eigentlich arbeitest.


----------



## hüteüberhüte (13. Jul 2012)

collection hat gesagt.:


> Bytecode de-komp... was?
> 
> Vielleicht bringt es dir noch nichts, die Sources der Collection anzusehen, aber irgendwann kommt der Punkt, an dem du wissen willst, womit du da eigentlich arbeitest.



Melde dich doch hier an, oder ist dir das zu un-anonym 

Man kann sich sicher auch die Sources von ArrayList ansehen, aber das hat nichts mit einem Decompilat, welches z.B. ein Decompiler generiert, zu tun


----------

