int size = 10;
int[] arr = new int[size];
int[] arr = new int[getSize()]; // wir unterstellen mal die Existenz der Methode getSize()...
ich hätte gesagt, indem du als attribut in der klasse int[] array; ganz oben stehen hast.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
Tatsächlich ist das die einzige Möglichkeit.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![]()
System.arraycopy(sourceArray, 0, newBiggerArray, 0, sourceArray.length);
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 ArrayListsTatsächlich ist das die einzige Möglichkeit.
Arraylist#add macht das intern auch so ähnlich.
Sei dir dessen mal nicht so sicher.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![]()
//Aus ArrayList.java
private Object[] grow() {
return grow(size + 1);
}
ArrayList<String> s = new ArrayList<>(2);
s.add("A");
s.add("B");
s.add("C");
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);
}
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:Das ist auch bei AdoptOpenJDK nicht anders.
(Das kommt jetzt aus den Sourcen, aber als JavaDoc findet sich das natürlich auch direkt in der Dokumentation der Klasse!)* 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 ist nur der Fall, wenn man add mit Index nutzt und am Ende der Liste hinzufügt.Sei dir dessen mal nicht so sicher.
Java://Aus ArrayList.java private Object[] grow() { return grow(size + 1); }
Ich glaube, da täuscht Du Dich.Das ist nur der Fall, wenn man add mit Index nutzt und am Ende der Liste hinzufügt.
size + 1
legt ja nur die minCapacity fest, nicht die tatsächliche neue Kapazität. 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);
}
}
grow(size + 1)
vergrößert das Array auf mindestens size + 1
, normalerweise aber um die genannten 50%.Oh, irgendwie hatte ich das komplett übersehen beim überfliegen der Klasse. Meine Aussage:Der Wertsize + 1
legt ja nur die minCapacity fest, nicht die tatsächliche neue Kapazität.
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 habenDer Code mit den +50% ist auch gar nicht mehr enthalten was ich so gesehen habe.
Da würde ich nicht nein sagen. Ich liebe ein Tomatenbrot mit Zwiebelchen.Will jemand frische Tomaten?
Ja, das hab ich eben auch übersehen.Sorry, hab mich völlig verguckt
Dasgrow(size + 1)
vergrößert das Array auf mindestenssize + 1
, normalerweise aber um die genannten 50%.
Wann wurde das denn geändert?Da evtl. noch der Hinweis: Das Verhalten hängt natürlich auch von der Version ab. OpenJDK 11 hat das beschriebene Verhalten:
![]()
openjdk-jdk11/src/java.base/share/classes/java/util/ArrayList.java at master · AdoptOpenJDK/openjdk-jdk11
Mirror of the jdk/jdk11 Mercurial forest at OpenJDK - AdoptOpenJDK/openjdk-jdk11github.com
Aber wenn jemand noch Java 8 / OpenJDK 8 verwendet, dann ist das Verhalten anders (wie man es teilweise in älteren Beiträgen findet):
jdk8/jdk8/jdk: 687fd7c7986d src/share/classes/java/util/ArrayList.java
hg.openjdk.java.net
==> Es wird immer mindestens um 50% erweitert ) oldCapacity >> 1 ist oldCapacity / 2Java: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); }
Wie in den nachfolgenden Beiträgen erklärt ist ja auch das erweitern um 50% die aktuelle ImplementierungWann 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
Lesen will halt gelernt sein ;-)Wie in den nachfolgenden Beiträgen erklärt ist ja auch das erweitern um 50% die aktuelle Implementierung![]()