Was ist in Java die maximale Länge, die ein Array besitzen kann?
Wehe dem, der mir das erste schickt, was er auf Google gefunden hat, ohne es vorher selbst auszuprobieren!
6 Antworten
Ich probiere es mal nicht aus, aber wahrscheinlich kannst Du nicht mehr als 2^31 Werte indexieren und du hast noch einen maximalen pysischen Hauptspeicher. Je nach Betriebsystem auch noch eine maximale Prozessgröße (2 GB zb).
Wenn Du so ein großes Array brauchst, hast Du aber was im Design deiner Anwendung falsch gemacht.
Nimm hier kein Array, sondern eine Liste (z. B. java.util.ArrayList oder java.util.LinkedList).
Dort fügst Du die Elemente mit add(...) an.
Nachdem Du alle eingefügt hast, holst Du Dir per size() die Länge der Liste, erstellst dann ein Array mit dieser Länge (per new String[]) und lässt die Liste ihren Inhalt über die Methode toArray(String[] a) in das Array schreiben.
Nimm hier kein Array, sondern eine Liste (z. B. java.util.ArrayList oder java.util.LinkedList).
Eine ArrayList ist ein Array (zumindest in Java).
Nein.
Eine ArrayList ist ein Objekt, eine Instanz der Klasse java.util.ArrayList, und implementiert das Interface java.util.List.
Ein Array hat in Java, nachdem es Erzeugt wurde, eine feste Anzahl an Elementen.
An eine ArrayList hingegen kann man dynamisch Elemente anhängen bzw. Elemente aus ihr entfernen, wie man das mit jeder Liste kann.
Und wie ist die ArrayList implementiert? Mit einem Array. Dazu wird jedesmal, wenn das Array dabei ist voll zu werden, ein neues Array mit der doppelten Größe erzeugt und alle Werte des alten Arrays übertragen.
Technisch ist es also weiterhin ein Array und keine Liste.
http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/java/util/ArrayList.java
Mir wäre auch keine Liste mit einem wahlfreien Zugriff bekannt.
Eig gehts mir auch nur darum zu sagen, dass eine ArrayList keine Liste ist, auch wenn sie ähnliche Funktionalitäten aufgrund des dynamischen Wachstums bietet.
Beispielsweise würdest du auch die Problematik mit der maximalen Länge von Arrays mit einer ArrayList bekommen, mit einer einfach verketteten Liste allerdings nicht.
Mir wäre auch keine Liste mit einem wahlfreien Zugriff bekannt.
Was Du meinst, ist eine verkettete Liste.
Eine solche ist beispielsweise in der Klasse java.util.LinkedList implementiert. Dort gibt es tatsächlich keinen wahlfreien Zugriff.
Aber nicht jede Liste ist eine verkettete Liste. Sonst bräuchte man das Attribut verkettet ja nicht. ;-)
Eig gehts mir auch nur darum zu sagen, dass eine ArrayList keine Liste ist
Natürlich ist es eine Liste. Sie erbt immerhin von java.util.AbstractList und implementiert das Interface java.util.List.
Natürlich ist es eine Liste. Sie erbt immerhin von java.util.AbstractList und implementiert das Interface java.util.List.
Und das macht es automatisch zu einer Liste? Mein Professor würd mich für die Aussage mit nem Besen jagen befürchte ich >_>
Und willste ernsthaft sagen, dass eine ArrayList nicht per Array implementiert ist, ich also theoretisch unendlich Werte reinschmeißen könnte? Oder willste sagen, dass Listen eig. keine spezifischen Eigenschaften haben es also eig. keine Listen als Datentypen gibt?
Und ja ich bin bei Datentypen in allgemeiner Definition mit ihren Eigenschaften, nicht wie sie anschließend genannt werden.
Und willste ernsthaft sagen, dass eine ArrayList nicht per Array implementiert ist, ich also theoretisch unendlich Werte reinschmeißen könnte?
Nein.
Selbstverständlich ist sie als Array implementiert und weist daher ebenfalls diese Begrenzung auf.
Oder willste sagen, dass Listen eig. keine spezifischen Eigenschaften haben es also eig. keine Listen als Datentypen gibt?
Doch, aber eventuell nicht die, die Du meinst. ;-)
Ist aber möglicherweise auch schlicht eine Definitionssache. Im Sinne der theoretischen Informatik scheint eine ArrayList tatsächlich keine "Liste" zu sein, da "Liste" hier anscheinend stets "verkettete Liste" meint.
Für mich ist eine Liste eine Datenstruktur, auf der bestimmte Operationen durchführbar sind, also eine bestimmte Schnittstelle und ein bestimmtes Verhalten bereitstellt. Und das tut ArrayList genauso, wie LinkedList. (Deshalb implementieren auch beide das Interface List.) Dass das Laufzeitverhalten der Operationen sich unterscheidet, ist klar.
Das lässt sich pauschal nicht beantworten, denn die maximale Länge eines Arrays hängt von der eingesetzten JVM ab. Zwei Faktoren sind dabei entscheidend:
- Für den Index des Arrays werden Integer verwendet. Damit kann ein Array nur so viele Elemente aufnehmen wie Indexes verfügbar sind. Theoretisch kommt man so auf eine Maximalgröße von Integer.MAX_VALUE (231-1).
- Praktisch gibt es aber einen weiteren beschränkenden Faktor: Der für die VM maximal verfügbare Arbeitsspeicher.
Das neueste JDK erlaubt dir eine Maximalgröße von Integer.MAX_VALUE - 2. Reicht der RAM dafür jedoch nicht aus, wird ein java.lang.OutOfMemoryError geworfen.
hab's grad mal ausprobiert (JRE 1.6, also nicht das frischeste, auf 'ner 1,5-GB-Testmaschine):
byte[] byteArray = new byte[0x20000000]
schmeißt sofort einen Out-of-Memory-Error,
byte[] byteArray = new byte[0x10000000]
jetzt wollte ich grade schreiben "rödelt immer noch rum", da ist der schon fertig.
Also irgendwo dazwischen.
Wenn man eine Maschine mit 16 GB nehmen würde und der JVM 8 GB als Speicher zuweist, sollte man auf das Maximum von 2^13-1 (0x7FFFFFFF) kommen. Hab jetzt aber nicht die Nerven, hier lange rumzukonfigurieren.
2^31 - 1
Der Index ist ein vorzeichenbehafteter 32 bit Integer, es sind aber nur positive Werte erlaubt.
nichtnegative. 0 ist auch erlaubt. (Auch für die Länge, egal, wie sinnvoll einem das erscheinen mag.)
Die maximale Länge ist Integer.MAX_VALUE - 8
Somit 2.147.483.639
Natürlich vorausgesetzt es ist genug Speicher vorhanden.
Wobei das war bei ArrayListen
Bei normalen ist der höchste Index
Integer.MAX_LIMIT-2
2147483645
Das ist die Methode:
Wie soll ich die Länge des Strings rausfinden?