Linked LinkedList

thomy800

Erfahrenes Mitglied
hi

ich habe das problem mit der standart-liste (LinkedList) in java, dass, wenn ich ein object einfüge, eine kopie davon erstellt wird.

bsp.: ich habe ein "kompliziertes" object. wenn ich object a=object b mache, wird a nicht aus b KOPIERT, sondern VERLINKT. dies ist hier erklärt: http://www.tutorials.de/forum/java/283456-objektorientiert.html

das selbe möchte ich mit einer liste machen. ich habe eine originalliste, aus der vereinzelte elemente herausgeholt werden und in eine neue liste geschoben werden sollen. allerdings soll wie gesagt diese neue liste nicht kopien von der originalliste beinhalten, sondern die verlinkungen. wenn ich das aber mit der standart add-methode mache, wird leider automatisch eine kopie erstellt.

eine alternative wäre, in der 2. liste nur die positionen der elemente in der originalliste zu speichern (wäre dann also Integer).

aber, kann ich das auch irgendwie auf die verlinkungs-art machen?

mfg thomy
 
Hey,
ich bin nicht sicher, ob dein Problem erfasst habe :) Generell zu Collections (in deinem Fall Listen), sie nehmen nur Objekte (keine primitiven Datentypen wie double, int, boolean etc.). Also sind immer Referenzen und keine Werte gespeichert.

Hier ein Beispiel:
Code:
List myLinkedList = new LinkedList();
myLinkedList.add(4);

Hier sieht es zwar so aus, also ob ein primitiver Wert, in diesem Fall ein int Wert in die Liste geschoben wird, aber seit Java1.5 sieht das intern so aus:
Code:
List myLinkedList = new LinkedList();
myLinkedList.add(new Integer(4)); // aus der primitiven int Wert 4, wird eine Interger Objekt erstellt.

Wenn du also zwei Listen hast und Werte hin und her kopierst/verschiebst, kopierst du eigentlich Refenzen (eine Art Links, die auf den Hauptspeicher zeigen) und nicht im eigentlichen Sinne die Werte. Für weitere Infos, Stichwort: Wrapper Klassen bei primitiven Datentypen

Wenn du z.B. zwei Listen hast(liste1 und liste2) und ein Objekt von der einen in die andere Liste verschieben möchtest:

Code:
liste2.add(liste1.remove(index)); //die Methode remove hat als Rückgabewert die Objektreferenz. Quasi verschiebst du nur den Link - nicht den eigentlichen Wert.

Ein weiteres Beispiel:
Code:
List liste3 = new LinkedList();
liste3.add(new Hallo());
List liste4 = new LinkedList();
liste4.add(liste3.get(0));
		
System.out.println(liste3.get(0));
System.out.println(liste4.get(0));

Ausgabe:
Hallo@dc8569
Hallo@dc8569

Zwei Referenzen, die auf das gleiche Hallo-Objekt zeigen. Und nach dem Aufrufen von:

liste3.remove(0);
liste4.remove(0);

Sind alle Referenzen von dem Hallo-Objekt gelösch. Der eigentliche Inhalt im Hauptspeicher wird vom Garbage Collector gelöscht, da keine Referenzen auf das Objekt zeigen.

Schönen Abend noch,
Gruß kon
 
ah, ok, danke. hab das mal noch etwas erweitert getestet:

Java:
class test {
public static void main(String[] args) {
        Hallo h=new Hallo();
        List liste3 = new LinkedList();
        liste3.add(h);
        List liste4 = new LinkedList();
        liste4.add(liste3.get(0));
        
        System.out.println(liste3.get(0));
        System.out.println(liste4.get(0));
        
        System.out.println(((Hallo)liste3.get(0)).i);
        System.out.println(((Hallo)liste4.get(0)).i);
        
        h.change();
        
        System.out.println(liste3.get(0));
        System.out.println(liste4.get(0));
        
        System.out.println(((Hallo)liste3.get(0)).i);
        System.out.println(((Hallo)liste4.get(0)).i);
    }
    static class Hallo {
        Integer i;
        public Hallo() {
            i=new Integer(123);
        }
        public void change() {i=new Integer(321);}
    }
}

ausgabe:

test$Hallo@9934d4
test$Hallo@9934d4
123
123
test$Hallo@9934d4
test$Hallo@9934d4
321
321


genau so wollte ich es haben :)
 
Kannst deine Liste noch etwas sicherer gestalten.

List<Hallo> list1 = LinkedList<Hallo>();

Somit musst du nicht mehr casten und erhälst eine Fehlermeldung, wenn du das hier probierst:

list1.add(5);//erzeugt einen Fehler und keine Exception

Und Fehler sind definitiv einfacher zu finden als Exceptions ;) Such einfach mal bei google nach Generics (seit Java 1.5)

Gruß Kon
 
Zurück