Java Array-Länge ändern?

t2im

Neues Mitglied
Hi, ich habe eine Frage und zwar wie kann man beim Erzeugen eines Arrays im Konstruktor die Array-Länge ändern? Also nicht array = new Array [3] sondern, dass man die 3 beim Erzeugen des Arrays ändern kann?

LG
 

JensXF

Mitglied
Wenn du durch eine Benutzereingabe meinst dann z.B. so
Java:
Scanner scanner = new Scanner(System.in);
int eingabe = scanner.nextInt();
int[] array = new int[eingabe];
scanner.close();
 
Zuletzt bearbeitet:

temi

Top Contributor
Java:
int size = 10;
int[] arr = new int[size];
Allgemein kannst du eine Variable für die Erzeugung des Arrays verwenden. Wo der Wert darin herkommt ist egal, das kann eine stinknormale Variable sein, der du einen Wert zuweist oder der Parameter einer Methode oder auch der Rückgabewert einer anderen Methode.
Java:
int[] arr = new int[getSize()]; // wir unterstellen mal die Existenz der Methode getSize()...
 

Kirby.exe

Top Contributor
Naja ist zwar nicht das effizienteste aber du könntest eine Methode erstellen, welche ein neues Array deiner gewollten Größe erstellt und alle Elemente aus dem alten Array in das neue copieren ;)
 

berndoa

Bekanntes Mitglied
Hi, ich habe eine Frage und zwar wie kann man beim Erzeugen eines Arrays im Konstruktor die Array-Länge ändern? Also nicht array = new Array [3] sondern, dass man die 3 beim Erzeugen des Arrays ändern kann?

LG
ich hätte gesagt, indem du als attribut in der klasse int[] array; ganz oben stehen hast.
vorausgesetzt deine klasse kriegt ein int n übergeben als parameter bei der objekterzeugung (aka int n ist der parameter vom konstruktor)
dann würde ich in den konstruktor einfahc ne zeile
array=new int[n]; packen.

bewirkt dass wenn du ein objekt der klasse erzeugst, dieses dann ein attribut array hat was ein int array der länge n ist.

Ansonsten eine shcon vorgegebene länge wieder verändern geht nicht.

müsstest du die variable einem neuen, größeren array zuweisen und ggbfls die wette aus dem lten kleinen array da reinkopieren
 

Neumi5694

Top Contributor
Naja ist zwar nicht das effizienteste aber du könntest eine Methode erstellen, welche ein neues Array deiner gewollten Größe erstellt und alle Elemente aus dem alten Array in das neue copieren ;)
Tatsächlich ist das die einzige Möglichkeit.
Arraylist#add macht das intern auch so ähnlich.
Ist das Array zu kurz, wird ein neues - größeres - erstellt, die alten Werte werden reinkopiert, dann der neue.

@ OP
Falls du wirklich auf Teufel Komm raus mit Arrays arbeiten willst (warum keine Listen, die sind doch so viel angenehmer?), dann schau dir diese Methode an:
Java:
System.arraycopy(sourceArray, 0, newBiggerArray, 0, sourceArray.length);
 

Neumi5694

Top Contributor
Naja aber die erweitert meist um mehr als nur eine Stelle und diese Operation nicht zu oft durchzuführen, dass sie sehr Laufzeitintensiv ist bei großen ArrayLists ;)
Sei dir dessen mal nicht so sicher.
Java:
  //Aus ArrayList.java
  private Object[] grow() {
        return grow(size + 1);
    }

Step mal in den dritten Aufruf rein.
Java:
    ArrayList<String> s = new ArrayList<>(2);
    s.add("A");
    s.add("B");
    s.add("C");
Am Ende wird elementData eine Größe von 3 haben.
Initialisiert man ArrayList ohne Parameter, hat Elementdata eine Größe von 10 und wird bei Bedarf um 1 erweitert (bei addAll(...) wird natürlich sofort um die notwendige Anzahl erweitert).

Deshalb: ArrayLists nach Möglichkeit immer mit der geschätzten Maximalgröße initialisieren oder per ensureCapacity nachträglich auf die gewünschte Größe setzen.
 
K

kneitzel

Gast
Da evtl. noch der Hinweis: Das Verhalten hängt natürlich auch von der Version ab. OpenJDK 11 hat das beschriebene Verhalten:

Aber wenn jemand noch Java 8 / OpenJDK 8 verwendet, dann ist das Verhalten anders (wie man es teilweise in älteren Beiträgen findet):
Java:
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
==> Es wird immer mindestens um 50% erweitert ) oldCapacity >> 1 ist oldCapacity / 2
 
K

kneitzel

Gast
Das ist auch bei AdoptOpenJDK nicht anders.
Ja, ich würde da auch kein wirkliches Kosten/Nutzen Verhalten sehen, hier Abweichungen vom OpenJDK einzuführen. Zumal da in den Kommentaren der Klasse ganz deutlich steht:

* Each {@code ArrayList} instance has a capacity. The capacity is
* the size of the array used to store the elements in the list. It is always
* at least as large as the list size. As elements are added to an ArrayList,
* its capacity grows automatically. The details of the growth policy are not
* specified beyond the fact that adding an element has constant amortized
* time cost.
(Das kommt jetzt aus den Sourcen, aber als JavaDoc findet sich das natürlich auch direkt in der Dokumentation der Klasse!)

Man sollte sich also auch nie auf irgend eine spezifische Implementation verlassen.
 
K

kneitzel

Gast
Das ist nur der Fall, wenn man add mit Index nutzt und am Ende der Liste hinzufügt.
Ich glaube, da täuscht Du Dich.

Ich habe @Neumi5694 so verstanden, dass er an den Code über den Debugger gekommen ist, d.h. er hat wirklich seine add Aufrufe verfolgt.

Das habe ich auch einmal nachgespielt (Wer weiss, was ich da sonst an Code finde in irgendwelchen Repositories :) ) und ich kann das auch bestätigen. Er läuft in das grow() rein was dann eben genau dieses grow(size + 1) aufruft.

Der Code mit den +50% ist auch gar nicht mehr enthalten was ich so gesehen habe.
 

temi

Top Contributor
Der Wert size + 1 legt ja nur die minCapacity fest, nicht die tatsächliche neue Kapazität.

Java:
    private Object[] grow(int minCapacity) {
        return this.elementData = Arrays.copyOf(this.elementData, this.newCapacity(minCapacity));
    }

    private Object[] grow() {
        return this.grow(this.size + 1);
    }

    private int newCapacity(int minCapacity) {
        int oldCapacity = this.elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity <= 0) {
            if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
                return Math.max(10, minCapacity);
            } else if (minCapacity < 0) {
                throw new OutOfMemoryError();
            } else {
                return minCapacity;
            }
        } else {
            return newCapacity - 2147483639 <= 0 ? newCapacity : hugeCapacity(minCapacity);
        }
    }
 

mrBrown

Super-Moderator
Mitarbeiter
Sorry, hab mich völlig verguckt :)

Das grow(size + 1) vergrößert das Array auf mindestens size + 1, normalerweise aber um die genannten 50%.

In dem Fall mit drei Elementen ist das eben genau 1, wenn man noch mehr hinzufügen würde, würde man auch größere Vergrößerungen sehen.

 
K

kneitzel

Gast
Der Wert size + 1 legt ja nur die minCapacity fest, nicht die tatsächliche neue Kapazität.
Oh, irgendwie hatte ich das komplett übersehen beim überfliegen der Klasse. Meine Aussage:
Der Code mit den +50% ist auch gar nicht mehr enthalten was ich so gesehen habe.
ist damit natürlich kompletter Quatsch. Der Code ist natürlich so enthalten wie Du ihn auch korrekt kopiert hast und ich war schlicht blind. (Will jemand frische Tomaten? Ganz frisch von meinen Augen gepflückt - bezüglich Sprichwort: Tomaten auf den Augen haben :) )
 

berndoa

Bekanntes Mitglied
Da evtl. noch der Hinweis: Das Verhalten hängt natürlich auch von der Version ab. OpenJDK 11 hat das beschriebene Verhalten:

Aber wenn jemand noch Java 8 / OpenJDK 8 verwendet, dann ist das Verhalten anders (wie man es teilweise in älteren Beiträgen findet):
Java:
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
==> Es wird immer mindestens um 50% erweitert ) oldCapacity >> 1 ist oldCapacity / 2
Wann wurde das denn geändert?
Wie war die ganze Zeit felsenfest der Überzeugung, das mit den +50% Kapazität wäre das aktuelle.
und nicht das lächerliche Erweitern um eine(!) Stelle! :O
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java Array Länge aus anderer Klasse lesen Java Basics - Anfänger-Themen 1
M Java Array Java Basics - Anfänger-Themen 8
G Java 2-dimensionalen int-Array Summe Java Basics - Anfänger-Themen 2
Splayfer Java Array Probleme Java Basics - Anfänger-Themen 3
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
I Java zweidimensionales array befüllen mit for-schleife Java Basics - Anfänger-Themen 2
M Quiz in Java programmieren mit Array Java Basics - Anfänger-Themen 8
L Java Int-Array, Zahlen sortieren Java Basics - Anfänger-Themen 8
T Java: Array monat absteigend sortieren? Java Basics - Anfänger-Themen 1
X Java zweidimensionales Array Java Basics - Anfänger-Themen 5
X Array List geordnet ausgeben. (JSF und JAVA) Java Basics - Anfänger-Themen 1
S Array Java erweitern Java Basics - Anfänger-Themen 27
M Wie kann ich im JAVA-GUI im Textfeld ein Array speichern Java Basics - Anfänger-Themen 4
B Java Array Fakultät Function Java Basics - Anfänger-Themen 5
E Wie wird in Java ein Char-Array terminiert ? Java Basics - Anfänger-Themen 15
kilopack15 Java Array Skalarprodukt testen Java Basics - Anfänger-Themen 21
T Variablen PHP Array jetzt für Java Java Basics - Anfänger-Themen 1
W Erste Schritte füllen Attribute java Klasse in for Schleife und Array Java Basics - Anfänger-Themen 16
X wie kann ich in bluej/java einene 2d array mit zahlen fuellen, so dass sich diese in der der zeilen Java Basics - Anfänger-Themen 2
J Java Array Zeichnung Skalieren und verschieben Java Basics - Anfänger-Themen 5
P Java : Array Fehler Java Basics - Anfänger-Themen 4
B Java rekursion minimum von ein array Java Basics - Anfänger-Themen 2
U JAVA - Ungerade Zahlen Array Java Basics - Anfänger-Themen 9
B Input/Output Formatierter Text aus PDF als Array auswerten in JAVA möglich ? Java Basics - Anfänger-Themen 8
T Erste Schritte Java ein Array Feld[index] zurueckgeben? Java Basics - Anfänger-Themen 20
U Kann man in Java ein Array zum Teil vorbelegen? Java Basics - Anfänger-Themen 4
J Java-Array abwechselnd Gross- und Kleinbuchstaben Java Basics - Anfänger-Themen 5
M Java spuckt Exeption bei Array aus Java Basics - Anfänger-Themen 2
T Collections Java Anfänger - Array-Struktur vollkommen unklar Java Basics - Anfänger-Themen 2
S Java Array Basic Java Basics - Anfänger-Themen 5
M java.util.ArrayList to java.sql.Array Java Basics - Anfänger-Themen 4
K Java Array Problem Java Basics - Anfänger-Themen 3
M Java Array - Durchschnitt Java Basics - Anfänger-Themen 7
S java array Java Basics - Anfänger-Themen 7
S JAVA Array Anwendersystem Java Basics - Anfänger-Themen 8
K java.lang.NullPointerException in Array bei Arraylistübergabe Java Basics - Anfänger-Themen 7
A Anfängerfrage - array required, but java.lang.String found Java Basics - Anfänger-Themen 7
J Ringpuffer als Array in Java ;-) Java Basics - Anfänger-Themen 3
B Java Array List größe auslesen zur Suchfunktion Java Basics - Anfänger-Themen 5
C Bäume in Java. Knoten in Array speichern Java Basics - Anfänger-Themen 3
C Java Array wie in PHP? Java Basics - Anfänger-Themen 9
S Java - Double-Array-Wertzuweisung erfolgt nicht Java Basics - Anfänger-Themen 4
S OOP Java Eingabe in verschiedene Datenbank Tabellen eintragen Java Basics - Anfänger-Themen 6
R Java Bücher hilfe Java Basics - Anfänger-Themen 6
frager2345 Java Beans -> PropertyChangeListener Java Basics - Anfänger-Themen 2
Scappy Java Lernpartner gesucht! Java Basics - Anfänger-Themen 15
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
frager2345 Optional Klasse Java Java Basics - Anfänger-Themen 2
JavaBeginner22 Java 2 Zufalls zahlen generieren. Java Basics - Anfänger-Themen 11
P Neue Java v8 JRE Version nicht über alte drüber installierbar: Wie sonst? Java Basics - Anfänger-Themen 7
B "Firmenhierarchie" in Java umsetzen? Java Basics - Anfänger-Themen 3
rosima26 Java SubSum bestimmen Java Basics - Anfänger-Themen 76
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
M Umgebungsvariable kann Java-Applikationen außerhalb der IDE nicht starten Java Basics - Anfänger-Themen 4
Sachinbhatt Was ist die Notwendigkeit eines Sammlungsframeworks in Java? Java Basics - Anfänger-Themen 2
Temsky34 Wie bekomme ich dieses Java-Warning wieder weg? Java Basics - Anfänger-Themen 2
berserkerdq2 sqllite in Java, wenn ich mache select count(*) ..., erhalte ich dann nur die gezählte Anzahl oder werden auch die Tabellen ausgegeben? Java Basics - Anfänger-Themen 2
berserkerdq2 Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams? Java Basics - Anfänger-Themen 5
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
M Variable Felderanzahl Java Java Basics - Anfänger-Themen 10
frager2345 Java Klasse Buch verwalten Java Basics - Anfänger-Themen 0
frager2345 Java eigen Klasse zum verwalten von Büchern Java Basics - Anfänger-Themen 3
frager2345 Java Java Basics - Anfänger-Themen 14
frager2345 Gauß Summenformel in Java Java Basics - Anfänger-Themen 10
T Java FXML selbes Fenster verschiedene Stellen im Programm Java Basics - Anfänger-Themen 5
C Wie berechne ich SQRT in Java? Java Basics - Anfänger-Themen 2
Fragerjava Java Schnittstellen Java Basics - Anfänger-Themen 6
volcanos sun.audio has been removed from Java since JDK 9 Java Basics - Anfänger-Themen 2
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
H Java Regex Aufzählung kontrollieren Java Basics - Anfänger-Themen 3
rosima26 Java nach letzter Ziffer sortieren Java Basics - Anfänger-Themen 19
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
B Dom Manipulationen mittels Java Java Basics - Anfänger-Themen 8
GoenntHack Java Text von JLabel verändert sich nicht Java Basics - Anfänger-Themen 1
Lacotto Java Kurs Aufgaben Hilfe Java Basics - Anfänger-Themen 14
D JAVA Programm schreiben Java Basics - Anfänger-Themen 46
D Java Pattern mit X Ausgabe Stern Java Basics - Anfänger-Themen 4
BATMAN_2008 Jackson adding additional fields to JSON throws java.util.concurrent.CompletionException: Java Basics - Anfänger-Themen 2
O Java Text Area Zeilenausgabe Java Basics - Anfänger-Themen 7
K Spieleidee gesucht für Informatikprojekt - JAVA (BlueJ)? Java Basics - Anfänger-Themen 15
S In Datei schreiben in Java? Java Basics - Anfänger-Themen 1
123456789sssssaaaa Java Wrapper Class Java Basics - Anfänger-Themen 13
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
A Java-XSSFBook: zwei Sheets mergen Java Basics - Anfänger-Themen 5
districon Java Nachhilfe - wo finden? Java Basics - Anfänger-Themen 9
J Benennung einer mir unbekannten Java - Ausdrucksweise Java Basics - Anfänger-Themen 5
rosima26 Taylor-Reihe in Java Java Basics - Anfänger-Themen 20
javamanoman Java für Online Banking Java Basics - Anfänger-Themen 12
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
Vernon.098 Java (BlueJ) Mensch ärgere dich nicht Programmien Java Basics - Anfänger-Themen 6
S Übungen Java von Kopf bis Fuß Java Basics - Anfänger-Themen 2
U Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
123456789sssssaaaa Which is the best way to Print Fibonacci Series in Java? Java Basics - Anfänger-Themen 3
H Auf Java-Klassenarbeit vorbereiten Java Basics - Anfänger-Themen 7
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5

Ähnliche Java Themen


Oben