Vectoren vs. "richtige" Arrays

Status
Nicht offen für weitere Antworten.

meez

Top Contributor
Wie perfomant sind eigentlich Vectoren im Gegensatz zu "richtigen" Arrays...???:L

Ein Vector ist ja auch ein Objectarray mit einer festen Startgrössen...Wird diese Grösse überschritten, so wird ein noch grösserer Objektarray erzeugt, und der Inhalt kopiert...:meld:
Das scheint zeimlich unperformant, aber praktisch...:D

Hat da jemand Erfahrung, wies mit der Performance aussieht :?:
 
B

Beni

Gast
Das Ereignis "vergrössern" wird im Vergleich zu den anderen Ereignissen "Object lesen" und "Object einschreiben" so selten aufgerufen, dass man keinen Unterschied bemerkt.
 

Sky

Top Contributor
Beni hat gesagt.:
Das Ereignis "vergrössern" wird im Vergleich zu den anderen Ereignissen "Object lesen" und "Object einschreiben" so selten aufgerufen, dass man keinen Unterschied bemerkt.

Diese Aussage ist viel zu allgemein gültig und ich denke, dass man sie so nicht stehen lassen kann.

Ein Vector wird mit der Größe 10 initialisiert und wächst um weitere 10 Elemente bei Bedarf (im Standardfall!). Wenn ich also den Fall nehme und 10.000 Elemente habe, dann wird ganz schön oft vergrößert!

Also: Wenn man vorher weiß, wie groß sein gewünschter Daten-Container minimum sein muss so sollte man das angeben; aber: ein großer Daten-Container braucht mehr Speicher als ein kleiner (auch im "leerem" Zustand!).

Wenn man also nicht aufpaßt, so kann der Vector ganz schön langsam werden. Außerdem ist der Vector dadurch, dass er "synchronized" ist eh schon mal ein wenig langsamer als z.B. eine ArrayList.

Des weiteren gilt zu beachten, dass ein "richtiges Array" schon typsicher ist:
Code:
    String[] s = new String[10];
    s[0] = new Integer[1];   // hier würde der Compiler schon meckern
    s[0] = new String("1");  // das hier geht

Dies ist aber bei einem Vector ist ab 1.5 so (aufgrund der Templates). In den JAVA-Versionen vor 1.5 muss man also die Objekte aus dem Vector ggfls. nochmal casten, wenn man Objekt-spezifische Operationen durchführen will. Und das kostet auch Zeit!

So, wenn noch Fragen sind, bitte melden :)

Grüsse, Sky
 
B

Beni

Gast
Ein Vector wird mit der Größe 10 initialisiert und wächst um weitere 10 Elemente bei Bedarf (im Standardfall!). Wenn ich also den Fall nehme und 10.000 Elemente habe, dann wird ganz schön oft vergrößert!
Im Standartfall wird die Grösse des Arrays verdoppelt (guck im Quellcode nach!), um von 10 auf 10'000 zu kommen, braucht es dann ganze 10 Vergrösserungen :wink:

Mit dem Rest bin ich einverstanden, aber im Normalfall ist ein Programm nicht aufgrund des leicht erhöhten Zugriffs auf ein Vector langsam... (du verstehst, was ich damit meine :bae: )
 

Sky

Top Contributor
Beni hat gesagt.:
Im Standartfall wird die Grösse des Arrays verdoppelt (guck im Quellcode nach!), um von 10 auf 10'000 zu kommen, braucht es dann ganze 10 Vergrösserungen :wink:
Ok, ok, hast ja recht war'n Denkfehler.

Beni hat gesagt.:
Mit dem Rest bin ich einverstanden, aber im Normalfall ist ein Programm nicht aufgrund des leicht erhöhten Zugriffs auf ein Vector langsam... (du verstehst, was ich damit meine :bae: )
Kann m.E. auch eine Ursache sein. Obwohl es natürlich auch viele, viele andere Faktoren gibt. Da hast Du recht!
 

meez

Top Contributor
Es ist ehh schlecht, wenn man Vectoren mit 100000 Einträgen hat...
Da wird der Vector auch nicht mehr ins Gewicht fallen...;)
 
B

bygones

Gast
persönlich halte ich es auch für unsinnig einen Vector von 1.000.000 Einträge sich im Speicher zu halten - bei einer solchen größen sollten DBs ins Spiel kommen und man sollte nur das auslesen was auch prozessiert wird.

Allgmein gilt: Vectoren und ArrayListen haben den Nachteil des neu allozierens (wie schon erwähnt), aber sind u.a. weil sie Arrays sind dadurch vorteilhaft, dass man indexbasiert auf sie zugreifen kann.

Wenn man aber viel einfügen bzw. löschen muss bietet sich z.b. die LinkedList an - bei ihr entfällt das Array kopieren...
 
G

Guest

Gast
Wenn es nur um den Aufbau einer Liste geht (nur Hinzufügen mit add(...) und Lesen immer von Anfang bis Ende),
dann ist LinkedList am schnellsten.
Vector würde ich nicht mehr verwenden. ArrayList ist besser und schneller.
 
G

Guest

Gast
meez hat gesagt.:
API und auch Oreilly's "Java Performance Tunning".
Laut der API sind fast alle Operation in Vector synchronized, während in
ArrayList nicht. Wenn nicht gerade von mehreren Threads aus darauf
zugegriffen wird, dann kann man auf eine "synchronized" Variante ruhig verzichten.
Dies macht bei intensiver Nutzung der Collections ziemlich viel aus.
Mach' doch mal einen Test mit allen Typen von Collections, dann siehst Du,
was in Deinem Fall am schnellsten ist. Es ist immer wieder von der Anwendung
abhängig.
 

Reality

Top Contributor
Vector ist ziemlich langsam da:

1. Man kann keine primitiven Typen speichern, sondern nur Objekte (trifft auch das ganze Collection Framework zu). Außer dass es langsam ist, entsteht auch viele MBs Datenmüll!
2. Es ist synchronized.

Wenn du primitive Datentypen speichern willst, dann würde ich mir eine Klasse schreiben, dass Arrays dynamisch vergrößert.
Und wenn du kein Multithreading verwendest, würde ich ArrayList oder LinkedList verwenden, da es nicht synchronized ist.

Liebe Grüße
Reality
 
G

Guest

Gast
Übrigens, das gleiche gilt für die Entscheidung Hashtable oder HashMap.
HashMap ist schneller aber nicht threadsafe.
 
S

stev.glasow

Gast
Reality hat gesagt.:
Vector ist ziemlich langsam da:

1. Man kann keine primitiven Typen speichern, sondern nur Objekte (trifft auch das ganze Collection Framework zu). Außer dass es langsam ist, entsteht auch viele MBs Datenmüll!
2. Es ist synchronized.

Wenn du primitive Datentypen speichern willst, dann würde ich mir eine Klasse schreiben, dass Arrays dynamisch vergrößert.
Und wenn du kein Multithreading verwendest, würde ich ArrayList oder LinkedList verwenden, da es nicht synchronized ist.

Liebe Grüße
Reality

Ich denke nicht , dass LinkedList wesentlich schneller ist weil es nicht synchronized ist.
Vector arbeitet mit einem Object-Array, was einem einen schnelleren Zugriff über den Index erlaubt aber wenn man Daten oft einfügt und der interne Array zu klein wird, muss ein neuer Array angelegt und der alte in diesen kopiert werden, was recht aufwendig ist.
LinkedList arbeitet hingegen als doppelt verkettete Liste, mit der man schnell Einfügen und Löschen kann (da das kopieren des Arrays entfällt) aber der Zugriff über den Index dauert darfür etwas länger.
Sprich, was schneller ist, hängt von der Anwendung ab.

Und das solch eine selbst geschriebene Klasse so viel bringt kann ich mir nicht vorstellen. Hast du das mal irgendwie verglichen?
 

foobar

Top Contributor
Reality hat gesagt.:
stevg hat gesagt.:
Und das solch eine selbst geschriebene Klasse so viel bringt kann ich mir nicht vorstellen. Hast du das mal irgendwie verglichen?
Ca. 63 mal bei mir.
http://www.c-plusplus.de/forum/viewtopic.php?t=84460&start=20

Das ist aber keine verkettete Liste. Ein verkette Liste sieht ungefähr so aus:
Code:
public class PrimitivArrayList
{
	private ListElement firstElement, lastElement;
	private int amountElements;
	public PrimitivArrayList()
	{
		this.firstElement = new ListElement(0, -1, null);
		this.lastElement = this.firstElement;
	}
	
	private ListElement getElementAt(int index, int currentpos, ListElement element)
	{
		return currentpos == index ? element : getElementAt(index, ++currentpos, element.getNext());
	}
	
	public int get(int index)
	{
		return index >= this.getSize() ? -1 : getElementAt(index, 0, this.firstElement).getValue();
	}
	
	private void print(ListElement element)
	{
		System.out.println(element);
		ListElement next = element.getNext();
		if (next != null)
		{
			print(next);
		}
	}
	
	public void add(int item)
	{
		if (firstElement.getValue() == -1)
		{
			firstElement.setValue(item);
		}
		else
		{
			ListElement newElement = new ListElement(lastElement.getPosition() + 1, item, null);
			lastElement.setNext(newElement);
			this.lastElement = newElement;
		}
		amountElements++;
	}
	
	public void printAll()
	{
		print(firstElement);
	}
	
	public int getSize()
	{
		return this.amountElements;
	}
	
	private class ListElement
	{
		private int value;
		private ListElement next;
		private int position;
		public ListElement(int position, int value, ListElement next)
		{
			this.position = position;
			this.value = value;
			this.next = next;
		}
		public ListElement getNext()
		{
			return next;
		}
		public int getValue()
		{
			return value;
		}
		public void setNext(ListElement element)
		{
			next = element;
		}
		public void setValue(int i)
		{
			value = i;
		}
		public int getPosition()
		{
			return position;
		}
		public void setPosition(int i)
		{
			position = i;
		}
		public String toString()
		{
			return this.getClass() + " position " + this.getPosition() + " value " + this.getValue();
		}
	}
	
	public static void main(String[] args)
	{
		PrimitivArrayList list = new PrimitivArrayList();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.printAll();
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Vectoren bearbeiten: ConcurrentModificationException Allgemeine Java-Themen 4
S Doppelte Werte in Listen,Vectoren etc suchen Allgemeine Java-Themen 2
G Kleine Frage zu Vectoren Allgemeine Java-Themen 2
W n Vectoren mit Vectoren füllen Allgemeine Java-Themen 11
P Array von Vectoren + Generics Allgemeine Java-Themen 6
G Vectoren Threads, und Multi Operationen Allgemeine Java-Themen 15
N warning bei Vectoren Allgemeine Java-Themen 15
C Vectoren befuellen sich von selbst Allgemeine Java-Themen 2
E Sortieren von Vectoren Allgemeine Java-Themen 5
B Lottospiel, genug Reihen tippen für 3 Richtige (Spaß mit Arrays)? Allgemeine Java-Themen 46
N Ist Selenium hier das richtige Werkzeug? Allgemeine Java-Themen 1
F Java Script für das Vorhaben das richtige? Allgemeine Java-Themen 9
B Logikfehlersuche, das perfekte Lottosystem für 3 Richtige mit Arraylists? Allgemeine Java-Themen 61
F Java die richtige Sprache? - Anfänger Allgemeine Java-Themen 3
T If Vergleich ergibt nicht das richtige Ergebnis Allgemeine Java-Themen 2
U Welches ist das richtige Entwurfsmuster Allgemeine Java-Themen 2
P Richtige Verwendung eines Timers Allgemeine Java-Themen 8
L Richtige Dokumentation eines Java Programms Allgemeine Java-Themen 5
J JSP die richtige Wahl Allgemeine Java-Themen 2
Final_Striker Exceptionhandling: Richtige Verwendung des Try/Catch Blocks Allgemeine Java-Themen 14
P Ist Java überhaupt das Richtige für mich? Allgemeine Java-Themen 7
G "Richtige" Konsolenanwendung (wie z.B. nano, cente Allgemeine Java-Themen 4
B Java, Ant und das richtige JDK? Allgemeine Java-Themen 9
T Ist IAdaptable die richtige Lösung? Allgemeine Java-Themen 4
O Oberfläche und "richtige" Programmierung Allgemeine Java-Themen 8
L Welche Collection ist die richtige ? Listen mergen Allgemeine Java-Themen 3
K Richtige JVM für jar Ausführung? Allgemeine Java-Themen 4
Ü Arrays vergleichen Allgemeine Java-Themen 59
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Ü Eurobeträge in möglichst wenig Scheine/Münzen zerlegen (2D-Arrays) Allgemeine Java-Themen 27
Buroto Arrays generator Allgemeine Java-Themen 10
B Arrays von Methoden möglich? Allgemeine Java-Themen 44
rosima26 Bester Sortieralgorithmus für kurze Arrays Allgemeine Java-Themen 40
Muatasem Hammud Erstellung von Testdaten für Arrays Allgemeine Java-Themen 6
Junger_Basileus Attribute, Arrays, Schleifen Allgemeine Java-Themen 9
P Generics und Arrays Allgemeine Java-Themen 6
O Arrays an DOCX-Stamper Library übergeben Allgemeine Java-Themen 1
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
R Spalten/Zeilen verschieben in zweidimensionalen Arrays? Allgemeine Java-Themen 3
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
W Spaß mit Arrays Allgemeine Java-Themen 1
W Reflexion und Arrays Allgemeine Java-Themen 7
S Problem mit Arrays Allgemeine Java-Themen 1
D Erste Schritte Arrays vergleichen und die zahlen die nur einmal vorkommen ausgeben Allgemeine Java-Themen 5
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
H Zweidimensionale Arrays Allgemeine Java-Themen 6
Neoline Methoden Zwei Arrays abwechselnd zusammenführen Allgemeine Java-Themen 15
J Methoden clone(), arraycopy(): ein- und zweidimensionale Arrays Allgemeine Java-Themen 8
D Übereinstimmungen in Arrays Allgemeine Java-Themen 5
B Arrays mit Text und Zahlen füllen Allgemeine Java-Themen 3
B Spalten eines 2d-Arrays Allgemeine Java-Themen 2
J Arrays auf gleichheit untersuchen funktioniert nicht Allgemeine Java-Themen 11
N 2 Arrays abwechselnd verbinden Allgemeine Java-Themen 13
J private and arrays Allgemeine Java-Themen 2
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
H Datentypen Typ eines Arrays überprüfen Allgemeine Java-Themen 9
C Zweidimensionale Arrays - Quadratisch? Allgemeine Java-Themen 4
AssELAss Zwei Arrays / ArrayLists inhaltlich vergleichen Allgemeine Java-Themen 2
A Lineare Interpolation mit zwei Arrays Allgemeine Java-Themen 4
S Datentypen Warum ist bei Arrays die Länge als Property aufrufbar? Allgemeine Java-Themen 1
Dechasa Vergleichen von zwei Arrays Allgemeine Java-Themen 4
DanielsLPecke Java Arrays an andere Java Programme schicken und zurück Allgemeine Java-Themen 5
H Arrays Allgemeine Java-Themen 4
J NullPointerExeption bei Inizialisierung eines Arrays Allgemeine Java-Themen 3
D Größe der Zahlenkombinationen eines Arrays begrenzen Allgemeine Java-Themen 3
B automatisch benannte arrays erstellen Allgemeine Java-Themen 9
Y inhalte aus 2 unterschiedlichen Arrays miteinander vergleichen Allgemeine Java-Themen 12
M Arrays.sort Problem Allgemeine Java-Themen 2
F Arrays Allgemeine Java-Themen 2
F Arrays Allgemeine Java-Themen 4
N Werte aus Arrays auslesen funktioniert nicht Allgemeine Java-Themen 5
F mehrdimensionale Arrays Allgemeine Java-Themen 4
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
S Java Problem bei der Rückgabe eines Arrays Allgemeine Java-Themen 19
I Verschiedene Arrays auslesen Allgemeine Java-Themen 6
R Wie kann man diese Methoden in arrays etablieren? Allgemeine Java-Themen 8
C Best Practice [Arrays] Wie sinnvoll prüfen, ob Array primitive Datentypen enthält? Allgemeine Java-Themen 6
C Best Practice Tiefe Kopie eines Arrays unbekannter Dimension und unbekannten Typs Allgemeine Java-Themen 4
R kann man irgendwie mit Arrays mit Eingabefenstern und Schleifen Werte abklappern? Allgemeine Java-Themen 2
R Was los mit dieser Aufgabe? Arrays mit Schachbrettmustern? Allgemeine Java-Themen 10
M Eingabe von Arrays geht über gewünschte Anzahl hinaus Allgemeine Java-Themen 2
K Methoden Arrays auf true Werte prüfen Allgemeine Java-Themen 4
T String Arrays aus den Argumenten auslesen Allgemeine Java-Themen 3
E ArrayIndexOutOfBounds - mehrdimensionale Arrays Allgemeine Java-Themen 6
D Arrays überschreiben sich Allgemeine Java-Themen 2
C Klonen von Arrays/ Matrizenrechnung Allgemeine Java-Themen 2
K Mehrere Arrays auf einmal erstellen Allgemeine Java-Themen 2
P Arrays erzeugen Allgemeine Java-Themen 5
R ListIterator über mehrere Arrays Allgemeine Java-Themen 13
S Variablen Dynamische Arrays Allgemeine Java-Themen 2
O Variablen System.getenv: Sinnlose Werte, Arrays?! Allgemeine Java-Themen 6
C Arrays.asList() - Problem Allgemeine Java-Themen 3
M problem mit speicherbedarf von arrays Allgemeine Java-Themen 14
B Generics und primitve arrays Allgemeine Java-Themen 6
V Umbennen von Arrays Allgemeine Java-Themen 7
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24

Ähnliche Java Themen

Neue Themen


Oben