kostenloser Webspace werbefrei: lima-city


"Zeiger" gesetzt?

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Ich habe ein kleines Problem.
    Ich spiele gerade ein bisschen mit zweidimensionalen Feldern herum, da muss ich feststellen, dass ich seltsamerweise unbewusst einen Java-Zeiger (die es ja eigentlich nicht gibt) gesetzt haben muss.
    Wir nehmen an, ich habe ein zweidimensionales Feld "f1[][]" und möchte dieses nun kopieren, um es zu verändern und Versuche damit anzustellen, ohne dass das Original auch verändert wird.
    private int[][] f1 = new int[10][10]
    
    private void blubb() {
       int[][] fTemp;
       // [...]
       fTemp = f1;
       // [...]
    }
    So einfach das auch wirkt, es funktioniert nicht. Wenn ich jetzt fTemp ändere, muss ich feststellen, dass am Schluss f1 mitverändert wurde. Ich habe es auch schon einmal so probiert:
    fTemp = f1.clone();
    Aber auch so wird f1 verändert. Es liegt definitiv an dieser Zuweisung. Wenn ich sie auskommentiere und fTemp leer initialisiere, wird nichts verändert.

    Da muss doch meiner Ansicht nach Java irgendwo intern einen Zeiger gesetzt haben. Wie kann ich das umgehen?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. benutzernaemelchen

    Kostenloser Webspace von benutzernaemelchen

    benutzernaemelchen hat kostenlosen Webspace.

    Natürlich ist das so.
    Primitive Datentypen werden per pass-by-value übergeben, aber alles was von java.lang.Object erbt, wird per pass-by-reference übergeben(also auch Arrays).

    du musst entweder in 2 for-schleifen dein array kopieren(was langsam wäre) oder, du benutzt System.arraycopy(was der schnellere Weg wäre).
  4. Das liegt daran, dass du Arrayobjekte erstellst, woraus folgt das eine Zuweisung nicht den Array sondern die Referenz darauf kopiert.
    Bedeutet: Den Array gibts dann bloß ein mal, aber mit zwei Namen. Um das zu verhindern musst du die einzelnen Elemente von einem Array in den anderen kopieren (per for-Schleife zum Beispiel), da diese Integer, also primitive Datentypen sind, weswegen dann keine Referenzen sondern Werte kopiert werden.

    Beispiel:
    for (int i=0; i<f1.length;i++) {
          for (int j=0;j<f1[i].length;j++) {
                    fTemp[i][j]=f1[i][j];
          }
    }


    Musst nur noch auf die Feldlängen aufpassen und fertig. Natürlich gibts auch schon fertige Funktionen, die das für dich erledigen...

    €dit: HMPF. benutzernaemelchen tippt schneller.

    Beitrag zuletzt geändert: 20.1.2011 17:06:07 von alphara
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!