Deklaration:
data ist der Name des Arrays.
Größe ist die nächste Position des letzten Elements im Array.
Gründe für die Implementierung dynamischer Arrays:
Da Arrays in Java statisch sind, müssen Sie beim Erstellen eines neuen Arrays die Größe des Arrays angeben Es muss eine unbekannte Anzahl gespeichert werden. Wenn der Speicherplatz zu klein eingestellt ist, können nicht alle Daten gespeichert werden Wir können eine automatische Erweiterung erreichen und müssen uns keine Gedanken mehr über die Array-Kapazität machen.
Wenn eine automatische Erweiterung oder automatische Verkleinerung erforderlich ist, liegt dies normalerweise daran, dass das Array voll ist oder zu viel freier Speicherplatz im Array vorhanden ist, was meist bei Hinzufügungs- und Löschvorgängen auftritt.
Wenn size == data.length
anzeigt, dass das Array voll ist, rufen Sie die Methode resize(int newCapacity)
auf und übergeben Sie die Parameter 2*data.length
, was bedeutet, dass die Länge des neu erstellten Arrays doppelt so groß ist wie die des ursprünglichen Arrays.
Empfohlene Video-Tutorials: Java-Kurs
Wenn size == data.length /4
und data.length/2 != 0
vorhanden sind, rufen Sie die Methode resize
auf, um die Größe zu reduzieren.
Der Parameter ist in der automatischen Erweiterungsmethode von ArrayList standardmäßig 1.5*capacity
.
Bei der Implementierung der resize()-Methode wird ein neues Array mit dem Namen newData
erstellt, um die Elemente im ursprünglichen Array aufzunehmen. Verwenden Sie eine for-Schleife, um Elemente im Array zu übertragen.
Methodenimplementierung hinzufügen
//向指定位置添加元素e public void add(int index,E e){ if(index<0||index>size){ throw new IllegalArgumentException("AddLast failed.Require index error"); } if(size == data.length){ resize(2*data.length); } for (int i = size-1; i >= index; i--) { data[i+1] = data[i]; } data[index] = e; size++; }
Methodenimplementierung entfernen
//删除元素,并返回被删除的元素 public E remove(int index){ if(index<0 || index >=size){ throw new IllegalArgumentException("Remove failed. Index is illegal"); } E ret = data[index]; for (int i = index+1; i < size; i++) { data[i-1] = data[i]; } size--; data[size] = null;//loitering objects != memory leak if(size == data.length /4 && data.length/2 != 0){ resize(data.length/2); } return ret; }
Größe der Methodenimplementierung ändern
private void resize(int newCapacity){ E[] newData = (E[])new Object[newCapacity]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } data = newData; }
Array-Klasse
package array; public class Array{ private E[] data; private int size; @SuppressWarnings("unchecked") public Array(int capacity){ data = (E[]) new Object[capacity]; size = 0; } public Array(){ this(10); } public int getSize(){ return size; } public int getCapacity(){ return data.length; } public boolean isEmpty(){ return size == 0; } //向第一个位置添加一个元素 public void addFirst(E e){ add(0,e); } //向最后一个位置添加一个元素 public void addLast(E e){ add(size,e); } //向指定位置添加元素e public void add(int index,E e){ if(index<0||index>size){ throw new IllegalArgumentException("AddLast failed.Require index error"); } if(size == data.length){ resize(2*data.length); } for (int i = size-1; i >= index; i--) { data[i+1] = data[i]; } data[index] = e; size++; } //获取index位置的元素e public E get(int index){ if(index<0 || index >=size){ throw new IllegalArgumentException("Get failed. Index is illegal"); } return data[index]; } //修改index索引位置的元素e public void set(int index, E e){ if(index<0 || index >=size){ throw new IllegalArgumentException("Get failed. Index is illegal"); } data[index] = e; } //判断元素是否存在于数组中 public boolean contains(E e){ for (int i = 0; i < size; i++) { if(data[i].equals(e)){ return true; } } return false; } //找到元素并返回索引 public int find(E e){ for (int i = 0; i < size; i++) { if(data[i].equals(e)){ return i; } } return -1; } //删除元素,并返回被删除的元素 public E remove(int index){ if(index<0 || index >=size){ throw new IllegalArgumentException("Remove failed. Index is illegal"); } E ret = data[index]; for (int i = index+1; i < size; i++) { data[i-1] = data[i]; } size--; data[size] = null;//loitering objects != memory leak if(size == data.length /4 && data.length/2 != 0){ resize(data.length/2); } return ret; } public E removeFirst(){ return remove(0); } public E removeLast(){ return remove(size-1); } //从数组中删除元素e public void removeElement(E e){ int index = find(e); if(index != -1){ remove(index); } } @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append(String.format("Array:size = %d ,capacity = %d\n",size,data.length)); res.append('['); for (int i = 0; i < size; i++) { res.append(data[i]); if(i != size-1){ res.append(","); } } res.append(']'); return res.toString(); } private void resize(int newCapacity){ E[] newData = (E[])new Object[newCapacity]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } data = newData; } }
Haupttest:
package array; public class Main { public static void main(String[] args){ Array<Integer> arr = new Array<>(); for (int i = 0; i < 10; i++) { arr.addLast(i); } System.out.println(arr); arr.add(1, 100); System.out.println(arr); arr.addFirst(-1); System.out.println(arr); arr.set(0, 1); System.out.println(arr); } }
Weitere verwandte Artikel und Tutorials finden Sie unter: Einführung in die Java-Entwicklung
Das obige ist der detaillierte Inhalt vonDie spezifische Implementierung dynamischer Arrays in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!