Déclarer :
data est le nom du tableau.
size est la position suivante du dernier élément du tableau.
Raisons de l'implémentation de tableaux dynamiques :
Parce que les tableaux en Java sont statiques, vous devez spécifier la taille du tableau lors de la création d'un nouveau tableau si les éléments qui le composent. doivent être stockés sont un nombre inconnu. Si l'espace est trop grand, cela entraînera un gaspillage. Si l'espace est trop petit, il ne pourra pas stocker toutes les données. Nous pouvons utiliser la méthode resize() écrite par. nous-mêmes pour réaliser une expansion automatique et ne plus nous soucier de la capacité du réseau.
Lorsqu'une expansion ou un rétrécissement automatique est requis, c'est généralement lorsque le tableau est plein ou qu'il y a trop d'espace libre dans le tableau, ce qui se produit principalement lors des opérations d'ajout et de suppression.
Lorsque size == data.length
indique que le tableau est plein, la méthode resize(int newCapacity)
est appelée et les paramètres sont passés dans 2*data.length
, ce qui signifie que la longueur du tableau nouvellement créé est le double de celle du tableau d'origine.
Tutoriels vidéo recommandés : cours java
Lorsque size == data.length /4
et data.length/2 != 0
sont présents, appelez la méthode resize
pour réduire la taille.
Le paramètre par défaut est 1.5*capacity
dans la méthode d'expansion automatique d'ArrayList.
Dans l'implémentation de la méthode resize(), un nouveau tableau nommé newData
est créé pour recevoir les éléments du tableau d'origine. Utilisez une boucle for pour transférer des éléments dans le tableau.
ajouter l'implémentation de la méthode
//向指定位置添加元素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++; }
supprimer l'implémentation de la méthode
//删除元素,并返回被删除的元素 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; }
redimensionner l'implémentation de la méthode
private void resize(int newCapacity){ E[] newData = (E[])new Object[newCapacity]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } data = newData; }
Classe Array
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; } }
Test principal :
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); } }
Pour plus d'articles et de didacticiels connexes, veuillez visiter : Introduction au développement Java
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!