Was ist in Java die maximale Länge, die ein Array besitzen kann?

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

EinSehrAnonymer 
Fragesteller
 26.03.2018, 23:04

Das ist die Methode:

private static String[] saveStringsToArray(String string) 
throws StringNotClosedException {
        String[] result = new String[DIE LÄNGE];
        String currentString = "";
        int resultLength = 0;
        
        boolean inString = false;
        
        for(char character : string.toCharArray()) {
            if(character == '"') {
                inString = !inString;
                
                if(!inString && !currentString.equals("")) {
                    result[resultLength] = currentString;
                    resultLength ++;
                    currentString = "";
                }
            }else if (inString) {
                currentString += character;
            }            
        }
        
        if(inString) {
            throw new StringNotClosedException();
        }
        
        return Arrays.copyOf(result, resultLength);
    }

Wie soll ich die Länge des Strings rausfinden?

1
NoHumanBeing  26.03.2018, 23:28
@EinSehrAnonymer

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.

1
Etter  26.03.2018, 23:53
@NoHumanBeing
Nimm hier kein Array, sondern eine Liste (z. B. java.util.ArrayList oder java.util.LinkedList).

Eine ArrayList ist ein Array (zumindest in Java).

1
NoHumanBeing  27.03.2018, 17:49
@Etter

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.

1
Etter  27.03.2018, 17:57
@Etter

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.

1
NoHumanBeing  27.03.2018, 18:04
@Etter
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.

1
Etter  27.03.2018, 18:23
@NoHumanBeing
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.

1
NoHumanBeing  27.03.2018, 22:04
@Etter
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.

1

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:

  1. 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).
  2. 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.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

2^31 - 1

Der Index ist ein vorzeichenbehafteter 32 bit Integer, es sind aber nur positive Werte erlaubt.

PWolff  27.03.2018, 00:06

nichtnegative. 0 ist auch erlaubt. (Auch für die Länge, egal, wie sinnvoll einem das erscheinen mag.)

3

Die maximale Länge ist Integer.MAX_VALUE - 8
Somit 2.147.483.639
Natürlich vorausgesetzt es ist genug Speicher vorhanden.

LisamagPferde04  26.03.2018, 23:22

Wobei das war bei ArrayListen
Bei normalen ist der höchste Index
Integer.MAX_LIMIT-2
2147483645

1