"echte" Zweidimensionalitaet bei Arrays in Java



  • Hallo,
    Ich habe eine Theoriefrage zu zweidimensionalen Arrays in Java: warum gibt es in Java keine "echten" zweidimensionalen Arrays (genau genommen)?

    Ich hatte letztlich eine Diskussion mit einem Bekannten, den ich nur sehr selten sehe, dieser versuchte mir zu erklaeren, dass es in Java keine "echten zweidimensionalen Arrays" gibt und zwar weil das irgendwie mit der unterschiedlichen Anzahl der Elemente in der zweiten Dimension zusammen haengt. Leider hab ich es damals nicht richtig verstanden und sehe ihn auch nur sehr selten. Ich weiss jedoch, dass er sich auskennt und mir scheint, dass dies mit Konzepten der theoretischen Informatik zusammenhaengt. Leider konnte ich jedoch keine Information darueber finden. Kann mir da vllt jemand weiterhelfen? Wo bekomme ich Definitionen ueber Zweidimensionalitaet, etc (vllt ein paar Links)?


  • Mod

    Wenn Du in Java etwas wie ein "int[][]" hast, dann ist das ein Array von int-Arrays. Jedes dieser int-Arrays kann eine unterschiedliche Länge haben. Es geht zum Beispiel sowas:

    int[][] array = new int[3][];
    array[0] = new int[20];
    array[1] = new int[10];
    array[2] = new int[15];
    

    Wenn man hingegen von "echten zweidimensionalen Arrays" redet, dann meint man nicht Arrays von Arrays, sodern eher soetwas:

    public class My2DIntArray
    {
       private int[] innerArray;
       public final int width;
       public final int height;
       public My2DIntArray(int width, int height)
       {
          this.width = width;
          this.height = height;
          innerArray = new int[width*height];
       }
       public void setElement(int x, int y, int value)
       {
          innerArray[y*width+x] = value;
       }
       public int getElement(int x, int y)
       {
          return innerArray[y*width+x];
       }
    }
    

    Also eine Art "rechteckiges" Array, bei dem man Breite und Höhe vorgeben kann. ...und sich darauf verlassen kann, dass die auch so bleiben.



  • Gut Danke fuer die schnelle Antwort, das trifft genau mein Problem. So aehnlich war die fluechtige Erklaerung damals auch. Das Bsp kommt mir ebenfalls nun bekannt vor. Mein Verstaendnisproblem jedoch ist:

    1. Wie Du selber in dem Bsp schreibst funktioniert es doch anscheinend in Java - oder kompiliert der Code nicht, wenn ja warum?! Bzw geht es darum, dass Java das von der Sprache her nicht unterstuetzt, man sich aber mit Code wie Deinem obigem abhelfen kann?

    2. Ich kann doch auch ein int[][] array mit gleicher "Laenge" und "Breite" definieren. Einmal erzeugt/allokiert ist das Array doch quasi auch "festgelegt". Ich haette also "unechte" und "echte" Zweidimensionalitaet, wobei letztere eine Teilmenge moeglicher Arrays waere. Wo liegt mein Gedankenproblem? ist es der Speicher, der "zusammenhaengend" sein muss - weshalb ich die Indizes als Produkt etwa von "Laenge" und "Breite" erzeuge? Oder der "Zwang" _nur_ arrays mit gleicher Anzahl von x und y Elementen erzeugen zu koennen, um echte Zweidimensionalitaet zu erhalten?


  • Mod

    Corcovado schrieb:

    1. Wie Du selber in dem Bsp schreibst funktioniert es doch anscheinend in Java - oder kompiliert der Code nicht, wenn ja warum?! Bzw geht es darum, dass Java das von der Sprache her nicht unterstuetzt, man sich aber mit Code wie Deinem obigem abhelfen kann?

    Ja, darum geht es eigentlich. Das ist halt nicht direkt in die Sprache eingebaut und wenn man soetwas braucht, dann muss man sich halt eine entsprechende Klasse schreiben, die das bietet.

    Corcovado schrieb:

    2. Ich kann doch auch ein int[][] array mit gleicher "Laenge" und "Breite" definieren. Einmal erzeugt/allokiert ist das Array doch quasi auch "festgelegt". Ich haette also "unechte" und "echte" Zweidimensionalitaet, wobei letztere eine Teilmenge moeglicher Arrays waere. Wo liegt mein Gedankenproblem? ist es der Speicher, der "zusammenhaengend" sein muss - weshalb ich die Indizes als Produkt etwa von "Laenge" und "Breite" erzeuge? Oder der "Zwang" _nur_ arrays mit gleicher Anzahl von x und y Elementen erzeugen zu koennen, um echte Zweidimensionalitaet zu erhalten?

    Es gubt da ne Menge Aspekte. Du kannst in einem Array von Arrays zum Beispiel immer ein inneres Array durch ein anderes ersetzen. Du kannst zum Beispiel solche Sachen machen:

    int[][] myArray = new int[5][10];
    myArray[0] = new int[20];
    myArray[1] = null;
    myArray[2] = myArray[3];
    

    Mit anderen Worten: Wenn Du eine Methode schreibst, die ein Array mit fester Breite und Höhe erwartet, musst Du dich ein bischen darauf verlassen, dass die Methode auch mit einem passenden Array aufgerufen wird. ...ansonsten müsstest Du entsprechende Checks einbauen, die natürlich keiner einbaut. 😃 ...aber das ist eigentlich kein großes Problem.

    Eine ganz andere Sache sind Performancebetrachtungen in diesem Zusammenhang. Wie Du schon sagtest, kann es diesbezüglich wichtig sein, dass die Elemente in einer bestimmten Reihenfolge im Speicher liegen. Ein weiterer Punkt ist, dass jedes Array eine gewisse Speichermenge für sich selbst braucht. ...und zwar 12 Byte. Da kannst Du dir ja mal überlegen, welchen Unterschied es beim Speicherverbrauch macht, ob ein int[10000000][2] nun ein Array von Arrays ist oder ein "echtes zweidimensionales Array".

    Trotzdem habe ich das Fehlen von diesen echten zweidimensionalen Arrays nie als großes Problem bei Java empfunden. Ich weiß nicht, was die Leute hauptsächlich antreibt, sich soetwas in Java zu wünschen. ...mir fallen da viele Dinge ein, die ich in Java viel lieber hätte als diese echten zweidimensionalen Arrays.



  • Vielen Dank, ich glaube ich habe es nun verstanden!

    In meinem konkreten Fall ging es darum, dass mein Bekannter bei einer Firma u.a. auch bei Einstellungsgespraechen Fachfragen gestellt hatte. Daraufhin kam ein Beispiel dazu mit Java und 2-dim Arrays. Da ich wohl diesen Sommer fertig werde und versuche eine Stelle zu bekommen, wollte ich mich mal informieren, was da so gefragt wird.

    Wie gesagt kam es mir nicht darauf an, hinzuweisen dass 2-dim-Arrays in Java absolut fehlen wuerden oder das Java deswegen schlecht waere. Java hat schon seinen Einsatzbereich. Ich denke, dass die Fuer und Wider Java Argumente auch eher andre sind, mir wuerden zumindest eher andere Aspekte einfallen, die ich fuer wichtiger erachte. Danke nochmal fuer die praezise Antwort!!



  • Ich frag mich gerade ob es überhaupt "echte zweidimensaional Arrays" gibt. Der Speicher ist ja wie allgemein bekannt nicht 2 sondern eindimensional. Und auch in Sprachen wie C wo der Index dann einen Offset angibt wäre der erste offset ebenfalls nur ein offset für die Speichergröße des enthaltenen Arrays.

    Lieg ich da soweit richtig?


  • Mod

    Rastachiller schrieb:

    Ich frag mich gerade ob es überhaupt "echte zweidimensaional Arrays" gibt. Der Speicher ist ja wie allgemein bekannt nicht 2 sondern eindimensional. Und auch in Sprachen wie C wo der Index dann einen Offset angibt wäre der erste offset ebenfalls nur ein offset für die Speichergröße des enthaltenen Arrays.

    Lieg ich da soweit richtig?

    Es handelt sich sicherlich um einen Begriff, der nicht sehr treffend ist. ...der spiegelt mehr die Vorstellung im Menschen wieder, als die Darstellung des Arrays im Speicher.



  • Lieg ich da soweit richtig?

    Joah, in C bzw. C++ ist ein

    int x[2][4];
    

    dann im Speicher auch nur noch ein

    int x[8];
    

    MfG

    GPC


Anmelden zum Antworten