Hallo,
würde gerne mit drawPolyline() einen Graphen zeichnen. Dazu übergebe ich bisher einfach Arrays, int xWerte[] = {1,2,3,4,5} und int yWerte[]={5,10,5,3,15}. Klappt auch ganz gut: g.drawPolyline(xWerte, yWerte, 5);
Jetzt möchte ich gerne in einer anderen Klasse Werte aus einer Textdatei einlesen, in ein Array packen und dann der Klasse mit dem g.drawPolyline() übergeben. Aber irgendwie klappt das ganze nicht so recht, so bin ich bisher vorgegangen:
String str = "irgendwas";
}```
jedesmal ein neues Objekt des Types String anlegen, wohingegen das hier
```String str = null;
while (blub) {
str = "irgendwas"
}```
immer das eine Objekt überschreibt.
String str = "irgendwas";
}```
[/quote]
das legt das an und es wird nach der Schleife zum Vernichten freigegeben
>
> jedesmal ein neues Objekt des Types String anlegen, wohingegen das hier
>
> ```String str = null;
> while (blub) {
> str = "irgendwas"
> }```
>
> immer das eine Objekt überschreibt.
hier wird das alte gleich zum Löschen greigegeben und das letzte existiert immer weiter
Nehmen wir mal den Fall du hast ne endlos-Schleife, dann isses schon verdammt blöd wenn die Objekte erst nach dem Beenden der Schleife zum Löschen freigegeben werden oder?
nein der String in der Schleife ist nach jedem Durchlauf weg
String str = "irgendwas";
}```
er erzeugt den String und nach bevor er oben überprüft ob er weiterlaufen soll wird alles was in dem String angelegt wurde (und nicht von wo anders referenziert wird) zum Vernichten freigegeben
```String str = null;
while (blub) {
str = "irgendwas"
}```
hier wird es halt das letzte freigegeben und das neue draufgesetzt
abgesehn davon das beim Letzten noch das Letzte immer da ist verhalten sich beide absolut gleich
Hi,
auch wenn ich etwas spät dran bin, was die eigentliche Frage angeht, so doch noch ein paar Anmerkungen:
Also als erstes ist es doch schon mal ganz unsauber, dass du hier ein statisches Array verwendest, das public ist (schau dir mal die Idee der OOP und hier den Punkt Kapselung an).
Die andere Sache ist, dass du offensichtlich eine unbekannte Anzahl von Elementen hast. Da eignet sich ein Array so ziemlich gar nicht. Du könntest es zwar mit jedem Element vergrößern, aber das würde sehr sehr viel Overhead mit sich bringen, neues Objekt erzeugen (doppelt belegter Speicher), altes Array kopieren, neues Element einfügen, altes Array freigeben. Viel schöner geht das ganze mit einer Liste. Verwende einfach eine ArrayList oder irgendeine andere Implementierung des List Interface, da kannst du einfach ein Element anhängen. Intern wird da (zumindest bei der ArrayList) dann auch ein Array verwendet. Dies kümmert sich aber selbst um die Größenanpassung (es werden gleich eine Menge Zellen reserviert und aut. nach Füllung vergrößert/verkleinert).
Aber auch die muss man natürlich einmal erzeugen
objekte sind immer blockweise bekannt, d.h. wird ein objekt in einer Schleife angelegt, wird es auch beim verlassen der schleife zerstoert.
Daher ist
String s = ....;
}```
besser als
String s = …;
for(int i = 0; i<x; i++) {
s = …;
}```
da im 2. fall s die ganze methode ueber bestehen bleibt (wenn die methode danach zu ende ist, ist es natuerlich schnuppe).
joa das sind sone Sachen die lernt man eigentlich nur inner Vorlesung/Unterricht weil das hab ich bisher in keinem Buch gesehen und daher wissen das viele Leute nicht
Aber müsste dann nicht die Methode “ich erstell in bei jedem Durchlauf nen neuen String” viel Performance-fressender seni als “Ich erstell mein Objekt vorher und überschreibe es nur jedesmal”? Weil bei Methode eins, wird ja in jeder Schleife ein neues Objekt erzeugt (Speicher zugewiesen) und am Ende wieder gelöscht (Speicher freigegeben) wohingegen Methode zwei das Objekt ja immer nur überschreibt. Oder täusche ich mich da?
du täuschst dich da, weil das s = “abc” ist im gewissen Sinne nichts anderes als s = new String(“abc”) und daher wird immer der Konstruktor aufgerufen und Speicher angefordert und am Ende freigegeben.
Das Einzigste wo ich mir nicht ganz sicher bin ist wie es sich mit der Variablen verhält ob das etwas Zeit kostet
Also wird bei s = “blub” nicht einfach der bereits zugewiesene Speicher überschrieben, sondern zum Löschen freigegeben und anschließend neuer angefordert!?
genau
Weil wenn du zB vorher “a” drin hattest und dann “abcdef” brauchst du ja auch viel mehr Platz und wenn danach was ist müsstest du laufend nachsehn wo gehts weiter und so packste einfach am Ende die neuen Daten rein und fertig