Diskussion:Array (Datentyp)

aus Wikipedia, der freien Enzyklopädie
Letzter Kommentar: vor 1 Jahr von Sebastian.Dietrich in Abschnitt Schachbrettbeispiel
Zur Navigation springen Zur Suche springen

Datenfeld[Quelltext bearbeiten]

Im Artikel steht: ...wird der hier – mit der Bedeutung ‚Array‘ – beschriebene Begriff ‚Feld‘ mit unterschiedlichen Ausdrücken belegt: Array, Tabelle, Vektor, Reihe, Reihung, Datenfeld, ... Ist Datenfeld und Feld (Datentyp) nun dasselbe oder nicht?? --UvM (Diskussion) 15:39, 10. Apr. 2015 (CEST)Beantworten

Kontextabhängig: Ja. Und: Nein.
Wie so manche Begriffe in der noch recht jungen Informatik kann der Begriff "Datenfeld" verschiedene Bedeutungen haben:
  1. ein Speicherplatz für nur genau 1 Datum;
    Der Artikel Datenfeld geht überwiegend von dieser Bedeutung aus (mit Ausnahme des letzten Satzes).
  2. ein Array als "Feld von Daten", also ein Array. Hießiger Artikel geht überwiegend von dieser Bedeutung aus.
--arilou (Diskussion) 15:53, 10. Apr. 2015 (CEST)Beantworten
Dieser Abschnitt kann archiviert werden. VÖRBY (Diskussion) 11:11, 1. Apr. 2023 (CEST) (siehe Artikeltext)

Defekte Weblinks[Quelltext bearbeiten]

GiftBot (Diskussion) 21:42, 26. Nov. 2015 (CET)Beantworten

Verschieben[Quelltext bearbeiten]

Es gibt außerhalb der theoretischen Informatik und vielleicht deutschen Haskell-Programmierern niemanden, aber auch absolut niemanden, der zu einem Array "Feld" sagt. Können wir den Artikel dorthin verschieben und den Begriffsklärungswust im Artikel "Feld" lassen? 2A01:598:C853:8FC9:9864:B0C9:EB7D:941E 07:35, 21. Mär. 2023 (CET) 2A01:598:C853:8FC9:9864:B0C9:EB7D:941E 07:35, 21. Mär. 2023 (CET)Beantworten

Ich denke, das entspricht dem Wikipedia-Grundsatz, Begriffe i.W. in Deutscher Sprache zu führen. So kommt man von Array zu Feld - das ja wörtlich genommen auch mehrdimensional ist (Länge, Breite). Ob man dieses 'Feld' nun woanders hinschieben soll, ich bin mir da nicht sicher; käme drauf an, wo das sonst noch offiziell definiert ist. --VÖRBY (Diskussion) 09:39, 21. Mär. 2023 (CET)Beantworten
"Array" steht im Duden. --80.187.65.136 15:14, 22. Mär. 2023 (CET)Beantworten
Ich habe keine Quelle gefunden, die für ein Array allgemein und grundsätzlich den Ausdruck 'Feld' verwendet.
  • Zum Teil wird erwähnt, dass 'Feld' als Synonym benutzt wird - oder dass das die Deutsche Übersetzung ist.
  • In vielen Quellen werden mit 'Feld/Felder' immer Element(e) von Arrays bezeichnet. Auch werden sie dabei 'Feldelement(e)' genannt.
  • Habe auch Quellen gefunden, die zwar (z.B.) in der Überschrift 'Array' lauten, die dafür aber im Text oft den Ausdruck 'Feld' benutzen.
  • An einer Stelle wird eine einzelne 'Zeile' eines Arrays 'Feld' genannt, also nicht das ganze Array; sowas wäre dann aber ein 'Verbund'.
Fazit: Unglückliche Situation. Den Artikel 'Array' zu nennen (und der Hinweis auf die Deutsche Übersetzung mit 'Feld') wäre wohl besser. Gibt es dazu weitere Meinungen? --VÖRBY (Diskussion) 13:32, 24. Mär. 2023 (CET)Beantworten
Ich kenne auch aus der deutschsprachigen Literatur fast ausschließlich den Begriff "Array" und finde, dass der auch hier verwendet werden sollte. --Bautsch 13:56, 24. Mär. 2023 (CET)Beantworten
Zudem vermisse ich den Hinweis, dass Arrays abzählbare Elemente haben. --Bautsch 13:57, 24. Mär. 2023 (CET)Beantworten
Ich bin auch für eine Verschiebung. Ein Feld ist in der IT ein Attribut einer Klasse, noch nie was anderes gehört. --Sebastian.Dietrich  ✉  20:16, 24. Mär. 2023 (CET)Beantworten
Niklaus Wirth hat in seinen Veröffentlichungen die Unterstrukturen (Listen) beziehungsweise Komponenten von Verbunden (RECORD) "Felder" beziehungsweise "Datenfelder" genannt (siehe beispielsweise "Algorithmen und Datenstrukturen" oder "Programmierung in Modula-2", Seite 85). --Bautsch 11:16, 25. Mär. 2023 (CET)Beantworten

Ich möchte zunächst den Artikeltext aktualisieren und das Lemma anschließend umbenennen oder verschieben lassen. Bitte etwas Geduld.--VÖRBY (Diskussion) 17:41, 25. Mär. 2023 (CET)Beantworten

Puh - hab beides gelesen und daheim, also muss ich das revidieren: statt "noch nie was anderes gehört" ein "seit 3 Jahrzehnten nichts anderes gehört". --Sebastian.Dietrich  ✉  22:24, 27. Mär. 2023 (CEST)Beantworten
Heißt das, der Begriff wird DOCH 'Feld' genannt? Außer in Wikipedia habe ich das kaum so gefunden - und es ist einfach missverständlich. Siehe auch die Diskussion in LEO darüber und die belegte Aussage "Array sei der gängigere Ausdruck". Ich meine schon, dass Arrays, Tabellen Matritzen usw. praktisch nirgends 'Feld' genannt werden. Wo findet man einen validen Beleg für 'Feld' - und dass das die 'gängige' Bezeichnung ist? Einzig der Ausdruck 'Standardfeld' assoziiert bei mir eine gewisse Nähe (sprachlich) zur 'Feld-Version' - aber auch da ist es hochgradig missverständlich. --VÖRBY (Diskussion) 09:59, 28. Mär. 2023 (CEST)Beantworten
Oder bedeutet Dein revidiertes "seit 3 Jahrzehnten nichts anderes gehört" (... als 'Array') , dass Du nach wie vor für die Verschiebung bist? --VÖRBY (Diskussion) 13:14, 29. Mär. 2023 (CEST)Beantworten
Ja klar bin ich für die Verschiebung - sorry war missverständlich .. --Sebastian.Dietrich  ✉  19:01, 1. Apr. 2023 (CEST)Beantworten

In Benutzer:VÖRBY/temp habe ich die neue Version - auf 'Array' umgetextet - abgelegt. Vorne bei Definitionen, Synonyme entsprechend umgestellt, Weiter hinten i.W. nur 'Feld' durch 'Array' ersetzt. Bitte dort mal überprüfen und ggf. Änderungsbedarf einstellen oder über Diskussion melden. Wie man den neuen Text dann ins Wiki bringt (mit ändern aller Links etc.), weiß ich aktuell noch nicht. Wer hat dazu Erfahrung?--VÖRBY (Diskussion) 13:49, 27. Mär. 2023 (CEST)Beantworten

Habe mir erlaubt, im Abschnitt Benutzer:VÖRBY/temp#Indizes einmal ein wenig zu ergänzen. Ich meine, dass dies der Veranschaulichung dienlich ist Verschieben kann man übrigens einfach über die Menüfunktion "Seite > Verschieben". --Bautsch 15:09, 27. Mär. 2023 (CEST)Beantworten
Erläuterungen zur Adressierung nach 'Adressierung' verschoben - und weniger mathematisch (allgemeinverständlicher) formuliert. Anfangswert (Null ...) steht schon woanders. --VÖRBY (Diskussion) 17:39, 27. Mär. 2023 (CEST)Beantworten

Dann würde ich 'Feld (Datentyp)' am Wochenende nach 'Array (Datentyp)' verschieben und dann den Text aus meinem Benutzer-Artikel ändernd 'drüberlegen'. Dann bleibt das Verschieben inkl. Diskussionen sichtbar und die Änderungen danach auch. Oder sollte man einen anderen Klammerausdruck (Informatik, Programierung ...) verwenden? Denn 'Datentyp' war eigentlich nur zur Abgrenzung des Ausdrucks 'Feld' von 'Feld/Datenfeld' im Allgemeinen erforderlich. --VÖRBY (Diskussion) 10:11, 31. Mär. 2023 (CEST) Aber: Da wir eine Klassifizierung brauchen, ist '(Datentyp)' konkreter als die o.g.; wie zB auch bei 'Verbund (Datentyp)' - kann also 'Array (Datentyp)' heißen.--VÖRBY (Diskussion) 11:11, 1. Apr. 2023 (CEST)Beantworten

Heute nach Array (Datentyp) verschoben und Texte entsprechend geändert. Ich hoffe, auch die entsprechenden Links 'erwischt' und umbenannt zu haben. --VÖRBY (Diskussion) 13:51, 2. Apr. 2023 (CEST)Beantworten

Einheitlicher Datentyp?[Quelltext bearbeiten]

Im Artikel steht an zwei Stellen, dass die Elemente von Arrays einheitliche Datentypen aufweisen müssen:

  • "Feldinhalte meist auf Elemente eines einzelnen Datentyps eingeschränkt"
  • "eines üblicherweise einheitlichen Datentyps"

Im Beispiel "eindimensional (mit Verbund-Datentyp)" wird jedoch das Gegenteil gezeigt: Das Array enthält Daten vom Typ Text, FixPunktZahl und Integer.

Sind die zitierten Aussagen falsch? Oder gilt die genanne Einschränkung nur für bestimmte Programmiersprachen oder Array-Formen? Oder ist damit gemeint, dass die jeweils definierten Elemente/Variablen für alle Indexwerte einheitlichen Datentyp auweisen? Hab leider bei Recherchen auch nur ungenaue Aussagen gefunden. --VÖRBY (Diskussion) 15:51, 1. Apr. 2023 (CEST)Beantworten

Schachbrettbeispiel[Quelltext bearbeiten]

Hi, beim Beispiel Schachbrett fällt mir auf, dass einfach 64 Zuweisungen (in 8er Gruppierung) vorgenommen wurden. Ein Zusammenhang zwischen den angeblich zwei Dimensionen (horizontal, vertikal) scheint dabei nicht zu existieren. Oder übersehe ich da was? Wodurch wird z.B. die Länge der Array-Elemente festgelegt? --VÖRBY (Diskussion) 12:14, 3. Apr. 2023 (CEST)Beantworten

Es gibt acht Zeilen mit je acht Zeichenketten ("String"). Die Variable "Schachfeld" (hier ist vermutlich eher der Plural "Schachfelder" oder der Singular "Schachbrett" gemeint) hat also acht Elemente vom Datentyp "array of String", und jedes "array of String" hat wiederum acht Elemente vom Datentyp "String". Das ist also ein zweidimensionales Array.
In Java hieße das:
private static java.lang.String spielfeld [][] = new java.lang.String [][]
   {
      {"w_Turm" ,"w_Springer","w_Läufer","w_König","w_Dame" ,"w_Läufer","w_Springer","w_Turm" },
      {"w_Bauer","w_Bauer"   ,"w_Bauer" ,"w_Bauer","w_Bauer","w_Bauer" ,"w_Bauer"   ,"w_Bauer"},
      {""       ,""          ,""        ,""       ,""       ,""        ,""          ,""       },
      {""       ,""          ,""        ,""       ,""       ,""        ,""          ,""       },
      {""       ,""          ,""        ,""       ,""       ,""        ,""          ,""       },
      {""       ,""          ,""        ,""       ,""       ,""        ,""          ,""       },
      {"s_Bauer","s_Bauer"   ,"s_Bauer" ,"s_Bauer","s_Bauer","s_Bauer" ,"s_Bauer"   ,"s_Bauer"},
      {"s_Turm" ,"s_Springer","s_Läufer","s_König","s_Dame" ,"s_Läufer","s_Springer","s_Turm" }
   };
--Bautsch 12:44, 3. Apr. 2023 (CEST)Beantworten
Danke. Ja, die Benennung des ganzen Konstrukts als 'Schachfeld' war missverständlich, 'Schachbrett' wäre besser. 'Schachfelder' wäre bereits der Plural - und etwas anderes!
Wieso muss eigentlich in der Deklaration 'Java' auftauchen? Das ist im Originalcode auch nicht der Fall (was ich für ok halte).
Ist durch 'Java.lang.String ...' die Länge je Element automatisch (zB auf 8) festgelegt?
Und wird die Anzahl der Elemente nur durch die 64 Zuweisungen bestimmt? Wer sagt eigentlich in Deinem Code, dass das 8*8 und nicht 4*16 sind? Etwa die Anzahl der Elemente je Zuweisungszeile? Wäre komisch!
"Dat Janze" ist für mich nach wie vor sehr undurchsichtig und als Beispiel weniger geeignet. --VÖRBY (Diskussion) 16:23, 3. Apr. 2023 (CEST)Beantworten
Das Beispiel stammt nicht von mir, und ich selber würde das nicht so programmieren, ich habe nur den Beispiel-Code in einen äquivalenten Java-Code übersetzt, damit das Beispiel eventuell besser verstanden oder nachvollzogen werden kann.
Der qualifizierte Bezeichner "java.lang.String" bezeichnet die Klasse "String" im Programmpaket "lang" des Moduls "java" (die Kleinschreibung ist wichtig), viele Java-Programmierer lassen das weg und schreiben nur "String", weil Java das leider erlaubt.
Die Java-Klasse "String" implementiert Zeichenketten als komplexen Datentyp mit einer Folge beliebiger endlicher Länge von Zeichen des Basisdatentyps "char".
Die Länge eines Arrays kann in Java übrigens mit dem inhärenten Datenfeld "length" folgendermaßen abgerufen werden:
  • spielfeld.length => Anzahl der Zeilen
  • spielfeld [0].length => Anzahl der Spalten in Zeile 0
Die Länge von Zeichenketten kann in Java mit der gleichnamigen typengebundenen (also in der Klasse "String" implementierten), parameterlosen Methode "length ()" abgerufen werden:
  • spielfeld [0][0].length () => Länge der Zeichenkette in Zeile 0 und Spalte 0 (im obigen Fall von der Zeichenkette "w_Turm", also 6)
Aufgrund der eindeutigen Struktur mit acht mal acht Zeichenketten kann der Übersetzer erkennen, dass das zweidimensionale Array "spielfeld" acht mal acht Felder enthalten soll. Durch die Erzeugung der Instanz mit dem new-Operator bekommt dieses zweidimensionale Array eine entsprechende und konstante Größe mit acht mal acht Zeichenketten.
Ja, die Deklarationsregeln in C und Java sind nicht besonders transparent, sofern sie (insbesondere in C) überhaupt existieren. --Bautsch 18:01, 3. Apr. 2023 (CEST)Beantworten
Das Beispiel im Code ist von Batsch schon korrekt in Java übersetzt - ich würde nur ein paar unnötige Dinge weglassen (das private static - weil für das Beispiel unerheblich und das java.lang. - weil man das in Java ohnedies nicht braucht).
Aber unabhängig davon ist das Beispiel ja auf der Seite eh nicht Java (d.h. würde es jetzt auf der Seite nicht in Java übersetzen).
Dass es ein 2-dimensionales 8x8 Array ist, sieht man mMn gut - es sind eben nicht 64 Zuweisungen auf Strings, sondern 8 Arrays mit je 8 Strings. @VÖRBY verstehe nicht, warum das Bestimmen der Größe durch die Anzahl der Elemente je Zeile komisch ist.
Und natürlich bin ich auch eurer Meinung, dass das ganze besser Schachbrett heißen sollte, was ich jetzt gleich mal geändert habe... --Sebastian.Dietrich  ✉  10:16, 4. Apr. 2023 (CEST)Beantworten
Wenn die zweite Dimension zB 20 Einträge hätte, müssten für die Wertzuweisung doch mehrere Zeilen verwendet werden, insgesamt also mehr als eine Zeile je Dimension1. Oder kennt der Compiler hier einen impliziten Zusammenhang zwischen der Deklaration (8*8) und der Zuweisungs-Operation - die ja schließlich das ganze Schachbrett, nicht die einzelnen Dimensionen anspricht. Wer sagt dem Compiler, wie lang die einzelnen Felder sind? Die Literale sind zB bei 'Turm' 6 Zeichen, bei 'Springer' = 9. Ist das bei 'String' egal? Wie wird dann die Adressrechnung vorgenommen? --VÖRBY (Diskussion) 10:56, 4. Apr. 2023 (CEST)Beantworten
In Java ist ein Array mit einer Liste an Refrenzen vergleichbar. Ein 2-dimensionales Array ist eine Liste an Referenzen auf Arrays. Darum ists möglich z.B. Ein Array der Städte je Bezirk je Bundesland zu haben.
Die Anzahl der Zeilen im Sourcecode ist unerheblich - eine Codezeile endet in Java mit einem ";" auch wenn der Code über 20 Bildschirmzeilen geht. Der Beistrich trennt die einzelnen Elemente, ein "},{" zeigt an, dass hier ein Array zuende ist und ein 2tes Array beginnt - beide wiederum Teil eines übergeordneten Arrays.
Ein String wiederum ist wie bei allen Objekten üblich nicht ein Pointer auf eine Speicheradresse. Strings sind unveränderbar und haben eine bei ihrer Instanzierung festgelegte Länge. Die Länge eines Strings hat nichts mit seiner Speicherbelegung zu tun. Diese ist z.B. von der Plattform (32 vs. 64bit) abhängig, ob der String komprimiert im RAM abgelegt wird (wenn alles oder Teile des Strings mit UTF-8 abbildbar ist) oder de-dupliziert (da ja Strings unveränderbar sind, können sie wiederverwendet werden). Die "Adressrechnung" macht die Laufzeitumgebung. Da gibts extrem viel Optimierungsschnickschnack - z.B. werden durch den Garbage Collector gleichzeitig verwendete Dinge oft nahe beieinander abgelegt, was kleine Pointer ermöglicht. Für den Programmierer alles völlig transparent und irrelevant. --Sebastian.Dietrich  ✉  00:13, 6. Apr. 2023 (CEST)Beantworten
Danke, für Nicht-Java-Leute vlt schwer verständlich:
'Array der Städte je Bezirk je Bundesland' ist doch in jeder Sprache möglich.
Stringlänge: Dann wäre 'w_Turm' also kürzer als 'w_Springer'? Wie lang ist dann das von ihnen belegte einzelne Feld? Nicht initialisierte Felder wären dann 0 Byte lang?
Dann kann das Beispiel unter 'Speicherabbildungsfunktion' ("2 (Zeilen überspringen) * 7 (Elemente pro Zeile) * 4 (Byte pro Element) = 56 (= Beginn der 3. Zeile im Array)") nicht stimmen.
Ich wollte nur sicherstellen, dass die Beispiele auch von der 'OMA' verstanden werden. Da stört mich i.W., dass nicht sichtbar ist wie lang die inneren Felder (und dadurch die Arrays) sind. Gruß --VÖRBY (Diskussion) 09:45, 6. Apr. 2023 (CEST)Beantworten
Naja ein 3-dimensionales Array mit unterschiedlich vielen Einträgen (Bundesländer haben unterschiedlich viele Bezirke, Bezirke haben unterschiedlich viele Städte) ist meines Wissens nach nicht mit jeder Sprache möglich.
w_Turm hat 6 Buchstaben, die Methode String.length() liefert auch 6, aber das Feld ist eine Referenz auf einen String. Die Felder in der Mitte sind leere Strings, die Methode String.length() liefert darum 0, aber auch da ist das Feld eine Referenz auf einen String. Da es viele Felder mit leeren Strings gibt, werden die im RAM vielleicht alle auf denselben leeren String referenzieren. Referenzen haben keine Länge und im RAM brauchen sie meines Wissens nach zu unterschiedlichen Zeiten auch unterschiedlich viel Speicher (je nachdem ob es zu dem Zeitpunkt long- oder short Pointer sind). Wo der String selbst liegt ändert sich potentiell bei jedem Durchlauf des Garbage-Collectors (ein GC macht z.B. Speicher-Defragmentierung).
Speicherabbildungsfunktion gibt es bei Java (und bei vielen anderen objektorientierten Sprachen auch) nicht. Sowas gibts nur in der C/C++ Welt. Die jeweiligen Strings liegen ganz woanders als das Array, das ja nur Referenzen auf die Strings hat.
Warum stört es dich, nicht zu wissen, wie lang die innerne Felder und dadurch die Arrays sind? Wenn ich ein Array von 8x8 Strings habe, dann muss ich nur wissen, dass ich 8x8 Strings habe und nicht wieviel RAM die brauchen. --Sebastian.Dietrich  ✉  15:52, 6. Apr. 2023 (CEST)Beantworten
Ganz schön rechenintensiv! Das gehört aber nicht hierher. Doch: Wenn (die Adressierung) so unterschiedlich ist, sollte man bei 'Abbildungsfunktionen' darauf hinweisen, dass das nur bei bestimmten Sprachen so läuft - und vielleicht, wie bei anderen Sprachen.
Auch an anderen Stellen ist von 'gleichartig strukturierten Daten' die Rede; wäre das mit Java-Verarbeitung dann eher ein 'Dynamisches Array'? HIER sollte eigentlich nur ein Beispiel dafür gezeigt werden, dass in einem mehrdimensionalen Array nur die innerste Ebene Daten/Einträge besitzt. Vielleicht kannst Du das Schachbeispiel in diesem Sinn 'irgendwie' klarer machen - oder wir lassen es einfach. Schöne Ostern! --VÖRBY (Diskussion) 16:25, 6. Apr. 2023 (CEST)Beantworten
Ja rechenintensiv, aber dennoch oft performanter als anders, da sich von der Laufzeitumgebung Dinge optimieren lassen, die zur Compilezeit noch nicht bekannt sind.
Die Frage ist halt, was "gleichartig strukturierte Daten" sind. Soweit ich dich verstehe, verstehst du darunter (im Fall von Strings) im RAM hintereinander platzierte gleichlange Zeichenketten? Sowas gibts (bei Strings) in den meisten Programmiersprachen nicht. Wenn man aber sagt, dass "Struktur" unabhängig von "Abbildung im RAM" ist, dann sind auch im Array der Städte je Bezirk je Bundesland Beispiel "gleichartig strukturierte Daten" weils eben Städte sind, die in einem 3-dimensionalen Array sind.
Aber im Artikel wird ja zwischen "In-sich-mehrdimensional" und "Array enthält weiteres Array" unterschieden. Ein Datentyp wie String eignet sich denke ich gar nicht um ersteres zu veranschaulichen, da die viele Sprachen für Strings eine Refrenz/Pointer auf den String verwenden. Dasselbe gilt aber auch schon für das "eindimensional (mit Verbund-Datentyp)" Beispiel, da ein Verbund-Datentyp auch oft als Referenz/Pointer in das Array kommt.
D.h. ich weiss jetzt auch nicht, wie wir das "hat mit der Abbildung im RAM potentiell nix zu tun" machen sollen, ohne auf Strings bzw. Verbund-Datentypen zu verzichten. Auf jeden Fall sollte der Abschnitt "Adressierung eines Arrays" verändert werden, weil das stimmt ja in vielen / den meisten Programmiersprachen nicht bzw. nur bei primitiven Datentypen --Sebastian.Dietrich  ✉  18:54, 6. Apr. 2023 (CEST)Beantworten

Zu meinem Verständnis noch einige Fragen:

  • Wie wäre das mit einfachen J/N Infos (oder 0/1) im innersten Array? Auch Referenzen?
  • ditto - mit einem beliebigen einzelnen Datenfeld wie Betrag, Temperatur usw. - ggf. aus Datenbanken gewonnen/eingelesen?
  • ditto - mit Verbund-Strukturen im innersten Array?
  • Ist das auch bei anderen Array-Formaten (zB Array-in-Array) so?
  • Oder auch außerhalb von Arrays? Als allgemeines Java-Prinzip?
  • Wäre die variable Dimensionsgröße bei 'Städte ...' (k)ein dynamisches Array?

Ja, das sollte schon irgendwo als Besonderheit (?) beschrieben oder erwähnt werden. Im Beispiel sollte aber andererseits nicht zu viel an Details der Rechner- und Sprachbesonderheiten reingebracht werden. Halt nur das, was an anderen Stellen des Artikels zu den Array gesagt wird, z.B. zur Länge.--VÖRBY (Diskussion) 09:39, 7. Apr. 2023 (CEST)Beantworten

  • Wie wäre das mit einfachen J/N Infos (oder 0/1) im innersten Array? Auch Referenzen?
Das kommt darauf an. Bei Java gibt es dafür Boolean (Klasse) und boolean (Primitiv) und automatischer (d.h. für den Programmierer nicht erkennbarer) Konvertierung zwischen den beiden. Beide kann man in typische Arrays stecken, in Collections (d.h. ähnliche Datenstrukturen mit weiteren Eigenschaften bzw. besserer Performance) derzeit nur Boolean. Bei Boolean hättest weiterhin Referenzen, bei boolean nicht. Aber beides ändert sich in Zukunft (siehe https://www.baeldung.com/java-valhalla-project): Boolean wird eine Primitive Klasse ("codes like a class, works like a boolean") und dann nicht mehr mit Referenzen im innersten Array abgebildet. Dasselbe gilt dann auch für String und alle anderen Klassen, die man als Value Class oder Primitive definiert.
  • ditto - mit einem beliebigen einzelnen Datenfeld wie Betrag, Temperatur usw. - ggf. aus Datenbanken gewonnen/eingelesen?
Siehe oben. Betrag, Temperatur sind typische Value-Objects gemäß Domain-driven Design und sinnvollerweise derzeit als Record und später dann als Value Class abzubilden. Dasselbe gilt insbesondere, wenn die Felder intelligent sind (also Betrag seine Währung, Temperatur seine Skala inkl. Umrechnungen auf andere Währungen/Skalen kennt).
  • ditto - mit Verbund-Strukturen im innersten Array?
Siehe oben. MonetaryAmount wäre so eine Verbund-Struktur mit Betrag und Währung. Derzeit wie gesagt nur als Referenz, später dann (wenn ValueClass oder sogar Primitiv) direkt
  • Ist das auch bei anderen Array-Formaten (zB Array-in-Array) so?
Array-in-Array ist ja so ein mehrdimensionales Array. Und ja ein Array selbst ist nur über eine Referenz erreichbar, also Array-in-Array ist eine Referenz auf Referenzen
  • Oder auch außerhalb von Arrays? Als allgemeines Java-Prinzip?
Java unterscheidet zwischen Stack und Heap: Primitive (und später auch Primitives) sind am Stack - es ist der Laufzeitumgebung exakt klar wo sie (ab der Startadresse der Methode) am Stack liegen, alles andere (auch Value Classes) am Heap - nur über Referenzen erreichbar und ändert zur Laufzeit u.U. die Position im RAM (d.h. eine Referenz ist kein Pointer, sondern eigentlich sowas wie ein Pointer auf einen Pointer, zweiterer kann vom GC geändert werden).
Hat eine Klasse z.B. 3 booleans, 1 Boolean und 1 String, so hat sie 2 Referenzen (eine auf Boolean, eine auf String) und 1 Byte (eines für die 3 booleans zusammen)
Dinge am Stack werden mit dem Verlassen der Methode freigegeben. Am Heap läuft der Garbage-Collector, gibt Objekte frei wenn sie nicht mehr von einem Thread referenziert werden. Referenziert also niemand mehr die Klasse, so wird deren Speicher (die 2 Referenzen und das Byte) freigegeben. Wird das Boolean bzw. der String auch nicht von anderswo referenziert, werden die dann auch freigegeben.
Für den Programmierer ist das alles aber eigentlich transparent, d.h. egal.
  • Wäre die variable Dimensionsgröße bei 'Städte ...' (k)ein dynamisches Array?
Nein - ein dynamisches Array bildet man in Java als eine der Collection-Klassen ab. Da gibt es z.B. Listen, Sets, ArrayLists etc - alle mit unterschiedlichen Eigenschaften/Einsatzzwecken. Aber alle haben gemein, dass die Größe zum Erzeugungszeitpunkt nicht klar ist bzw. sich ändern kann. ArrayList z.B. hält die Daten im Hintergrund in einem Array. Wenn mehr Daten reinkommen, als das Array groß ist, wird ein deutlich größeres Array hergenommen, die Daten reinkopiert, mit dem weitergemacht und das alte Array weggeschmissen.
--Sebastian.Dietrich  ✉  11:44, 7. Apr. 2023 (CEST)Beantworten