Guten Morgen,
[...]
Hashtable<String, Vector<Object>> hashes = new Hashtable<String, Vector<Object>>();Vector<String> vect_1 = new Vector<String>(); //Hier sind 4 Strings drin
Vector[] vect_2 = new Vector[4];//vect_2 wird dann mit Instanzvariablen/Attributen (Objekte) einer anderen Klasse gefüllt
[0] -> Obj1, Obj2, Ob3
[1] -> Obj3, Obj4, Ob5
[2] -> Obj6, Obj7, Ob8
[3] -> Obj9, Obj10, Ob10while (i < vect_1.size()) {
hashes.put(vect_1.elementAt(i),vect_2[i]);
i++;
}return hashed;
- Wenn ich nun das Hash zurückgeben sollte, und später sich die Instanz bzw. das Attribut der anderen Klasse ändert sollte, ändern sich auch der Wert in hashes?
Scheinbar ist es noch zu früh, denn ich verstehe immer noch nicht, was da in Deinem Quellcode passiert. vect_2 ist ja definiert als Array von Vectoren, deshalb kannst Du dort nur Vector-Objekte ablegen. Du hast also am Ende der while-Schleife in der Hashtable die Strings aus vect_1 und den dazugehörigen (über den Index definiert) Vector aus vect_2. In dem einzelnen Vector in vect_2 stehen verschiedene Objekte (Obj1 - Obj10).
Die Hashtable zeigt intern nur auf Stellen im Speicher. Da liegt also z.B. der String mit dem Index 0 aus vect_1 an der Adresse 123. Es zeigen also vect_1 auf diese Adresse, und der erste Key in der Hashtable auch. Bei Strings hast Du aber den Fall, dass die immutable sind, die können sich also nicht ändern. Anders Deine Vector-Instanzen bzw. Obj1 - Obj10. Auch die haben irgendeine Adresse (z.B. 1000 - 1100 in 100er Schritten). Auf diese Adressen zeigen Deine Vectoren in dem Vector-Array, aber auch die Values in der Hashtable. Änderst Du jetzt eine dieser Instanzen (entweder durch einen Zugriff von der Hashtable aus oder von einem Vector aus, dann ändert sich das Objekt an der Speicherstelle. Und damit wird die Änderung sowohl für die Referenzen im Vector, als auch in der Hashtable gültig. Call by Reference ist hier das Stichwort.
- Wenn ich den Vector vect_2 nicht durch Objekte von einer anderen Klasse, sondern durch irgendwelche Objekte gefüllt hätte, die ich temporär/lokal in der Methode oben angelegt habe und das Hash zurückgebe, wie verhält sich das ganze an (Hoffentlich habe ich mich verständlich ausgedrückt)
Leider nein. Das Verhalten ist immer das oben beschriebene. Du hast Objekte an einer Stelle im Speicher und hältst Referenzen darauf. Wenn Du innerhalb einer Methode ein Objekt unter dem Namen "obj" erzeugst und in eine Hashtable ablegst und diese zurückgibst, dann gibt es nach dem Verlassen der Methode Dein "obj" nicht mehr. Aber es gibt noch die Referenz in der Hashtable und damit kann diese Instanz noch erreicht werden. Das ist auch der Grund, warum der Garbage Collector diese Instanz noch nicht abräumen kann: weil sie noch irgendwo referenziert wird.
[...]
if (xy instanceof String && xy.equals("br"))Sollte halt ein String sein, denn wenn es keine instanceof von String ist, sondern von was anders, dürfte .equals bei einer eigenen Klasse nicht gehen.
Dann reicht der Check auf null und der Aufruf der Methode equals. Diese ist für jedes Object definiert und prüft standardmäßig auf Instanzgleichheit (wieder die Adresse im Speicher). Wird sie von einer Unterklasse von Object überschrieben, dann kann hier inhaltliche Gleichheit geprüft werden. In fast jedem Fall wird aber innerhalb der Methode equals auch abgeprüft, ob die übergebene Instanz vom korrekten Typ ist. Denn ein Flugzeug kann fachlich nicht equal zu einem Auto sein.
Schöne Grüße,
Peter