ArrayList effizient einsetzen

Laren

Bekanntes Mitglied
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
• maximale Teilnehmerzahl (muss > 0 sein)
• Teilnahmegebühr (muss > 0.0 sein)
und mindestens den folgenden Methoden
• Teilnahme buchen: Falls die maximale Teilnehmerzahl noch nicht überschritten ist, wird ein Kunde zum
Seminar hinzugefügt. Jeder Kunde kann nur eine Teilnahme buchen.
• Teilnahme stornieren: Die Buchung mit der angegebenen Kundennummer wird wieder entfernt.

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
 

Eldorado

Bekanntes Mitglied
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

Bekanntes Mitglied
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.
 
Zuletzt bearbeitet:

Eldorado

Bekanntes Mitglied
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

Bekanntes Mitglied
ok, das macht Sinn:)

Noch ne kleine Zusatzfrage:

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

Laren

Bekanntes Mitglied
Hi,

Ich habs jetzt so mal getestet:

Java:
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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
 

Neue Themen


Oben