# ArrayList effizient einsetzen



## Laren (19. Feb 2011)

Hi,

Ich schreibe bald eine Klausur in Java und ich bin zur zeit ein wenig am rätseln.
Es kommt wahrscheinlich eine Aufgabe dran, die in etwa so aufgebaut ist:



> Es ist eine sehr einfache Seminarverwaltung zu erstellen. Dazu wird zunächst eine Klasse Kunde benötigt
> mit den Merkmalen Kundennummer, Name und Rabatt-Prozentsatz (muss zwischen 0.0 und 100.0 liegen).
> Erstellen Sie zusätzlich eine Klasse Seminar mit den Attributen
> •      Seminartitel
> ...



Für mich wäre es hier am sinnvollsten in der Klasse Seminar eine ArrayList zu erstellen, die Objekte von Kunden aufnimmt. Mein Bedenken ist nur, dass die Aufgabe effizient zu lösen ist, was mit nur einem Array (also keinem ArrayList) besser ist, da man beim Array schon bei der initialisierung die Anzahl der Elemente festlegt. Wobei man mit Arraylist  mehr Funktionen von Haus aus hat(wie add, del...) , aber eben etwas unnötig ist, wenn man das Array mit 101 Elementen füllen, da man dann ja glaube 99 frei Stellen im Array hat. Würde hier TrimToSize, das ganze effizient gestallten?

Ps: Ich will nicht, dass mir jemand die Aufgabe löst

Grüße


----------



## Final_Striker (19. Feb 2011)

Laren hat gesagt.:


> Würde hier TrimToSize, das ganze effizient gestallten?



Nein. Nimm einfach einer ArrayList und fertig.


----------



## Laren (19. Feb 2011)

Final_Striker hat gesagt.:


> Nein. Nimm einfach einer ArrayList und fertig.



Aber wozu gibt es denn dann TrimToSize?


----------



## Final_Striker (19. Feb 2011)

Damit kann man die Größe des Array in der ArrayList an die Größe der ArrayList anpassen.


----------



## Eldorado (19. Feb 2011)

Ich würde das folgendermaßen erklären (nur eine eigene Einschätzung): 
Stell dir vor, du fragst Werte ab, bei der die Anzahl variable ist, als nimmst du eine ArrayList. Du weißt aber, wann keine neuen Werte hinzukommen. An dieser Stelle würde ich zum optimieren TrimToSize aufrufen, um Speicher zu sparen.

Du musst auch immer bedenken, dass die Methode ja auch Ressourcen benötigt, um ihre Arbeit zu erledigen (auch wenn ich die Implementierung nicht kenne, ist aber eine grundsätzliche Frage bei der Optimierung)


----------



## Laren (19. Feb 2011)

aber ist es denn nicht so, dass das Array in ArrayList mit den ungenutzen Elementen nur unnütz Speicher belegt?

Edit:

Ok, aber macht es nicht sinn, bei jedem hinzufügen von einem Element TrimToSize auszuführen, somit würde doch nie zuviel Speicher verbraucht werden, als gebraucht wird.


----------



## Eldorado (19. Feb 2011)

Und wenn du die Methode aufrufst? Dann wird wahrscheinlich erstmal dass komplette Array in ein kleineres kopiert. Bis der GarbageCollector dieses alte, nicht mehr referenzierte Array löscht kann eine ganze Zeit vergehen. Und während diese Zeit wird das Array zwei mal im Arbeitsspeicher hängen.
Ich denke nicht, das ein paar leere Array-Stellen da ins Gewicht fallen...

(Bitte korregieren, wenn ich hier Quatsch erzähle, habe mich mit den Hintergründen noch nicht so ausführlich auseinander gesetzt)


----------



## Laren (19. Feb 2011)

ok, das macht Sinn

Noch ne kleine Zusatzfrage:

Kann ich ArrayList mit einer festen Größe initialisieren?


----------



## Eldorado (19. Feb 2011)

Java Api:ArrayList (Java Platform SE 6)


----------



## Laren (20. Feb 2011)

Hi,

Ich habs jetzt so mal getestet:


```
import java.util.*;
public class Listen {

	/**
	 * @param args
	 */
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Integer> liste = new ArrayList<Integer>(2);
		liste.add(2);
		liste.add(3);
		liste.add(4);
	}

}
```

Aber müsste nicht eine arrayoutofboundsexception kommen, wenn ich in ein Array mit 2 freien Elementen 3 Stück reinschreibe?

Grüße


----------



## Eldorado (20. Feb 2011)

Das Limit wird automatisch erhöht. Den Wert, den du übergibst, ist nur ein Startwert. Sobald du über das Limit hinauskommst, wird dieses automatisch erhöht. Das ist ja der Vorteil der Arraylist gegenüber einem einfachen Array.


----------



## Bert Brenner (20. Feb 2011)

Nach den Quelltexten von Sun,

wird wenn ein einzelnes Element hinzugefügt wird und das Array im Hintergrund nicht mehr reicht, die Arraygröße um den Faktor 1,5 vergrössert. Wenn man also eine ungefähre Abschätzung hat wieviele Elemente in die ArrayList kommen, kann man ein wenig Geschwindigkeit dadurch gewinnen, das man die initialCapacity angibt. (Standard ist übrigends 10)

Aufrufe von trimToSize sollten auch nur gemacht werden wenn die Rechenzeit über hat und den Speicher unbedingt braucht.

In deinem Szenario weisst du ja schon wieviele Elemente maximal in deiner ArrayList gehalten werden müssen, daher würde ich sie dann einfach damit initialisieren und fertig. Das erspart dann beim hinzufügen von Elementen das für deinen Fall unnötige System.arrayCopy


----------

