ArrayList/Vector lassen sich im Konstruktor entsprechend konfigurieren, eine eigene Klasse ist daher unnötig.Roar hat gesagt.:@corcovado: wenn die anzahl strings in der größenordnung sind würde ich mir vielleicht eine eigene Listenmklasse schreibgen, die den array imerm um 500 elemente vergößert oder so wenn nötig...
Wildcard hat gesagt.:ArrayList/Vector lassen sich im Konstruktor entsprechend konfigurieren, eine eigene Klasse ist daher unnötig.
tja, aber es ist doch sicherlich moeglich zu einem Array neuen Speicher dazu zuallokieren oder etwa nicht in Java - was anderes wird doch der Vektor auch nicht machen? Auch wenn ihn das eben daher auch teurer macht als ein Array?!wenns immer gleichviele sin is nen array sinnvoller sonst vector das hängt eigentl weiger von der größe ab
tja Array == Array, aber das "drumrum" (Object, Allokation, Iteratoren, etc) hat doch auch konstruktoren (=Speicherallokation), dh fuer mich es kostet also (wenn die Denkweise so auch bei Java richtig sein sollte)?Vector ansich ist auch nur ein Array mit Methoden drumrum - einzige was in verlangsamen würde ist dass alle Methoden synchronized sind... aber ansonsten... nö
Ok, make it work - was nun? Ich mach mir auch keinen Kopf ueber Optimierungen zu Projekten die nicht existieren, allerdings hab ich gerade ein Projekt und ueberlege das Ding zu Optimieren. Es gibt sicherlich einige andere, zunaechst naeherliegende Sachen - dabei bin ich grad, is aber nich das Thema hier - was mich hier interessiert ist, dass ich eher ueber die generelle Strategie nachdenke wie ich eine zentrale Datenstruktur etwa generell umstrukturieren sollte oder nicht. Das is wiederum etwas mehr Aufwand, daher wollte maln Paar Meinungen hoeren.Erste Grundregel ist "make it work". Ich mache mir nicht unnötig Kopf um dolle Optimierungen, wenn ich noch gar nicht weiß, ob sie notwendig sind. So komme ich ja mit der Entwicklung nie ausm Quark.
@dbac: das was speicher verbraucht ist woh ldas array kopieren und wenn du 1000 strings hin und her kopieren muss kann sichdas shcon bemerkbar machen. [/code]
...an interne Copycontruktoren hab ich noch gar nicht gedacht, sollte aber eigentlich kein grosses Problem bei meiner speziellen Sache darstellen.
@Roar die zweite:
Code:@corcovado: wenn die anzahl strings in der größenordnung sind würde ich mir vielleicht eine eigene Listenmklasse schreibgen, die den array imerm um 500 elemente vergößert oder so wenn nötig...[/quote] Das ist GENAU das was ich hier durchdiskutieren will. Danke! So aehnlich hab ichs mir auch vorgestellt, ich weiss nur eben nicht ob sich das schon rentiert bei einigen oder einigen 1000 Elementen oder ob das ueberhaupt was bringen koennte?
wie ?tja Array == Array, aber das "drumrum" (Object, Allokation, Iteratoren, etc) hat doch auch konstruktoren (=Speicherallokation), dh fuer mich es kostet also (wenn die Denkweise so auch bei Java richtig sein sollte)?
Allokieren kostet nix in Java? Interessant!? Ein Array allokiere ich i.d.R. einmal und damit ist der Speicher festgelegt, es sei denn ich benoetige mehr Platz, dann muss ich neuen Speicher allokieren. Das macht evtl Vorteile von einem Array ggnueber einem Vector wieder etwas zunichte, das meinte ich hiermit ja auch:Das neu allozieren ist nicht das Problem des Vectors, sondern das hat man auch bei einem normalen Array !
afaik muesste ein Vector, allein schon weil er Objekte speichert einen Iterator besitzen - bei Arrays mit primitiven Typen reicht Index; einen Copy Constructor besitzen, bei Arrays prim Typen reicht eine Zuweisung, etc.tja Array == Array, aber das "drumrum" (Object, Allokation, Iteratoren, etc) hat doch auch konstruktoren (=Speicherallokation), dh fuer mich es kostet also (wenn die Denkweise so auch bei Java richtig sein sollte)?
Und wie funktioniert dann der Index in nem Vector, wenn es sich nicht um prim. Typen handelt, dafuer benoetigt der Vektor doch irgendwen, der ihm sagt, wie gross meine uebergebenen Objekte sind, damit es seinen Inhalt _sicher_ rauf und runter lesen kann, oder nicht?! Mir ist klar, dass wenn ich einen fertigen Vector haben will, ich mich da nicht rumschlagen will, was der im Hintergrund macht, solange er das macht, was ich von ihm erwarte.Object hat erstmal nichts damit zu tun - Allokation hast du überall - Iterator wird beim erstellen gar nicht verwendet. Nur wenn du per iterator() einen anforderst....
drumrum um ein array sozusagen... Das Array mit Armen, Beinen, Augen, Ohren und Nase wiegt also genausoviel wie ohne?!wie gesagt - Vector ist eine "Wrapper" Klasse für Arrays. mehr nicht.
ich stimme aber auch Wildcard zu - erst das Projekt an sich zum Laufen bringen und dann optimieren....
Hae - laeuft doch...is nur langsam, u.a. vielelicht auch wegen dem Vector Dings.Ich hab bisher alles in einen Vektor von einem Vektor von String eingelesen, das war urlangsam (auf Pentium 2 und es gehoert eh nochmal generell ueberarbeitet).
Kenne ArrayList nich, werds mir mal ansehn.was zu problemen bei Vector/ArrayList machen kann sind einfügungen im Array bzw. Löschen eines Elements. Beim einfügen muss ja ab dem Einfügungsort alles eins nach rechts kopiert werden, beim löschen alles eins nach links.
naja, aber bei nem array kann ich nich einfach was einfuegen und dann alles nach hinten schieben, da muesste ich fuers letze element wieder ein neues allokieren - in sofern isses der selbe Kack, stimmt, wenn ich allerdings ne gewisse feste Groesse hab und erst ab ner hoeheren (ausnahmsweise), was dazuallokieren muss - isses denk ich schon ein Vorteil ggnueber nem Vector, der das von Hause aus immer macht.Diese Probleme hast du aber auch wenn du mit einem normalen Array arbeiten willst und nicht null werte drin haben willst.
deathbyaclown hat gesagt.:wie schon erwähnt - man kann dem Konstruktor die Größe des Arrays für den Vector angeben. Das neu allozieren ist nicht das Problem des Vectors, sondern das hat man auch bei einem normalen Array !
ich habe nie behauptet, dass das Allozieren nichts kostet - deine Argumentation ist aber falsch. Wenn du den Vector mit einer festen Größe initialisierst wirst du auch nicht neu allozieren. in beiden Fällen (Array / Vector) musst du wenn der Platz nicht ausreicht neuen Speicher allozieren. Beim Array musst du es halt von Hand machen, der Vector macht das automatisch. Also nochmal: Beide sind gleich der Vector bietet nur zusätzliche MethodenCorcovado hat gesagt.:Allokieren kostet nix in Java? Interessant!? Ein Array allokiere ich i.d.R. einmal und damit ist der Speicher festgelegt, es sei denn ich benoetige mehr Platz, dann muss ich neuen Speicher allokieren. Das macht evtl Vorteile von einem Array ggnueber einem Vector wieder etwas zunichte, das meinte ich hiermit ja auch:
komplett falsch. Vector ist intern (wie gesagt) nichts anderes als Object[]. d.h. er arbeitet auch nur über index. Zugriff ist indexbasiert - wie in einem Array. Also hat er keinen Iterator. Wenn du die MEthode iterator() aufrufst wird ein Iterator Objekt erzeugt dass indexbasierend über den Array läuft.Corcovado hat gesagt.:afaik muesste ein Vector, allein schon weil er Objekte speichert einen Iterator besitzen - bei Arrays mit primitiven Typen reicht Index; einen Copy Constructor besitzen, bei Arrays prim Typen reicht eine Zuweisung, etc.
basierend auf der Tatsache dass Vector intern Object[] ist - hast du das gleiche Problem bei einem Array.Und wie funktioniert dann der Index in nem Vector, wenn es sich nicht um prim. Typen handelt, dafuer benoetigt der Vektor doch irgendwen, der ihm sagt, wie gross meine uebergebenen Objekte sind, damit es seinen Inhalt _sicher_ rauf und runter lesen kann, oder nicht?! Mir ist klar, dass wenn ich einen fertigen Vector haben will, ich mich da nicht rumschlagen will, was der im Hintergrund macht, solange er das macht, was ich von ihm erwarte.
nein - dem Vector kannst du die Größe auch angeben und ab welchem Füllungsgrad er neu allozieren soll. Daher ist der Vector eben vorzuziehen gg dem Array da er solche Problematiken für dich übernimmt.naja, aber bei nem array kann ich nich einfach was einfuegen und dann alles nach hinten schieben, da muesste ich fuers letze element wieder ein neues allokieren - in sofern isses der selbe Kack, stimmt, wenn ich allerdings ne gewisse feste Groesse hab und erst ab ner hoeheren (ausnahmsweise), was dazuallokieren muss - isses denk ich schon ein Vorteil ggnueber nem Vector, der das von Hause aus immer macht.
warum?Linked list - nix fuer ungut, aber da ich bleib dann doch eher noch bei Vector, denk ich...
wieso das Rad neu erfinden ? Swing ist auch nicht ausgereift aber deswegen was neues ?Vector is ja im Grunde auch nicht schlecht - es waere sicherlich nen Haufen Arbeit so was aehnliches (richtig) zu implementieren, was dagegen dann zB nur auf die eigene Funktionalitaet abgestimmt ist und DAHER etwa vielleicht Vektor ggnueber nen Vorteil hat. Werd mal schaun ob ich dazu was ergoogeln kann.
nicht richtig.Roar hat gesagt.:ich dachte da weniger an das allokieren, mehr an das kopieren aller elemente in den neu allokierten array. wenn man ne menge datenmengen hinzufügt muss der vector alle 10 (standart oda?) elemente ein neuen array allokieren und die alten elemente kopieren. wenn man 500 daten hinzufügt muss der vector das ganze 50 mal machen, bei einer allokierungsgröße von 500 nur einmal
Each vector tries to optimize storage management by maintaining a capacity and a capacityIncrement. The capacity is always at least as large as the vector size; it is usually larger because as components are added to the vector, the vector's storage increases in chunks the size of capacityIncrement. An application can increase the capacity of a vector before inserting a large number of components; this reduces the amount of incremental reallocation.
Something you should also know about Vectors: don't use them.
> Something you should also know about Vectors: don't use them.
Unless you are using a library like Swing. i.e. because you have to.
> ...so what's wrong with Vector
It's slow, because it's synchronized. It's also outdated. Use an ArrayList, it's much faster and provides the very same services.
outdated würde ich nicht sagen. Slow deswegen weil eben alle methoden synchronisiert sind... punktCorcovado hat gesagt.:Ich werds mal mit ner ArrayList versuchen, ich hab woanders noch das hier gefunden:
Something you should also know about Vectors: don't use them.
> Something you should also know about Vectors: don't use them.
Unless you are using a library like Swing. i.e. because you have to.
> ...so what's wrong with Vector
It's slow, because it's synchronized. It's also outdated. Use an ArrayList, it's much faster and provides the very same services.
"slow" und "outdated" ?!! :roll:
deathbyaclown hat gesagt.:Bei vergrößerungswert == 0 -> einfache verdoppelung.
> Vector/ArrayList/Arrays, I thought about improving that - sure...
All three have very fast indexed access of each element but there are differences. Arrays are fastest because there are no method calls. Then comes ArrayList. Vector is slowest because it's synchronized.
Performance is not determined by the data structure alone. It also depends on what the algoritm does. Arrays (whether static or dynamic (like ArrayList and Vector)) may not be the fastest option for your problem. The data structures and algoritms must be considered in conjunction.
Using arrays directly will offer the best performance. There is absolutely no need to use Vectors for anything except legacy code.
Using char[] in place of Strings is only worthwhile if you have a large number of small Strings.