diff --git a/Java/ArrayListProxy.java b/Java/ArrayList.java similarity index 68% rename from Java/ArrayListProxy.java rename to Java/ArrayList.java index e71393bfbda2d9b80c88dae9a77f68f4e2ab324d..4c259b84aae309ad07efb8c41e02f5a47696d129 100644 --- a/Java/ArrayListProxy.java +++ b/Java/ArrayList.java @@ -1,18 +1,18 @@ -import java.util.ArrayList; +import java.util.Arrays; /** Cette classe est un proxy pour les ArrayList, c'est à dire les tableaux dynamiques en Java. On utilise cette classe afin d'avoir le contrôle sur la gestion de la mémoire. */ -public class ArrayListProxy<T> { +public class ArrayList<T> { /** Constructeur de la classe des tableaux dynamiques. Complexité en temps/espace, pire et meilleur cas : O(1) */ - public ArrayListProxy() { + public ArrayList() { this.capacity = 4; - this.data = new ArrayList<T>(this.capacity); + this.data = new Object[this.capacity]; } /** @@ -24,12 +24,11 @@ public class ArrayListProxy<T> { @returns true si le tableau a été agrandit, false sinon */ boolean append(T x){ - boolean memory_allocation = false; - if( do_we_need_to_enlarge_capacity() ){ - memory_allocation = true; - enlarge_capacity(); + boolean memory_allocation = do_we_need_to_enlarge_capacity(); + if( memory_allocation ){ + enlarge_capacity(); } - data.add(x); + data[size++] = x; return memory_allocation; } @@ -41,13 +40,11 @@ public class ArrayListProxy<T> { @returns true si le tableau a été réduit, false sinon */ boolean pop_back(){ - boolean memory_reduction = false; - if(!data.isEmpty()){ - if( do_we_need_to_reduce_capacity() ){ - memory_reduction = true; - reduce_capacity(); - } - data.remove(data.size()-1); + boolean memory_reduction = do_we_need_to_reduce_capacity(); + if(size != 0){ + if( memory_reduction ) + reduce_capacity(); + size--; } return memory_reduction; } @@ -58,8 +55,9 @@ public class ArrayListProxy<T> { @param pos est la l'indice de la case on l'utilisateur veut connaître la valeur. @returns la valeur située à la position donnée par l'utilisateur. */ + @SuppressWarnings("unchecked") T get(int pos){ - return data.get(pos); + return (T)data[pos]; } /** @@ -68,7 +66,7 @@ public class ArrayListProxy<T> { @returns le nombre d'éléments stockés dans le tableau. */ int size(){ - return data.size(); + return size; } /** @@ -85,15 +83,15 @@ public class ArrayListProxy<T> { @returns true si le tableau doit être agrandi, false sinon. */ private boolean do_we_need_to_enlarge_capacity() { - return data.size() >= (capacity * 3)/4; + return size >= (capacity * 3)/4; } /** Cette fonction augmente la capacité du tableau. */ private void enlarge_capacity(){ - capacity *= 2; - data.ensureCapacity( capacity ); + data = java.util.Arrays.copyOf(data, capacity*2); + capacity *= 2; } /** @@ -101,19 +99,21 @@ public class ArrayListProxy<T> { @returns true si le tableau doit être réduit, false sinon. */ private boolean do_we_need_to_reduce_capacity(){ - return data.size() <= capacity/4 && data.size() >4; + return size <= capacity/4 && size >4; } - - /** - Cette fonction reduit la capacité du tableau. - */ - void reduce_capacity(){ - capacity /= 2; - data.ensureCapacity( capacity ); - } - - // Tableau dynamique en Java. Sa capacité réelle est masquée, mais on peut avoir un contrôle dessus. - private ArrayList<T> data; - // Capacité réelle du tableau data. - private int capacity; + + /** + Cette fonction reduit la capacité du tableau. + */ + void reduce_capacity(){ + data = java.util.Arrays.copyOf(data, capacity/2); + capacity /= 2; + } + + // Tableau dynamique en Java. Sa capacité réelle est masquée, mais on peut avoir un contrôle dessus. + private Object[] data; + // Capacité réelle du tableau data. + private int capacity; + // Nombre réel d'éléments dans le tableau. + private int size; } diff --git a/Java/Main.java b/Java/Main.java index 4c5a8bfd46795013a1fa9845da2521c8f7ec3734..4f0dac33e3cf5ee6feef544bda157d41146e64d5 100644 --- a/Java/Main.java +++ b/Java/Main.java @@ -5,13 +5,13 @@ public class Main { public static void main(String[] args) { int i, time_ind = 0, pop_ind = 0; // Tableau dynamique. - ArrayListProxy<Integer> a = new ArrayListProxy<Integer>(); + ArrayList<Integer> a = new ArrayList<Integer>(); // Analyse du temps pris par les opérations. Analyzer time_analysis = new Analyzer(); // Analyse du nombre de copies faites par les opérations. Analyzer copy_analysis = new Analyzer(); - // Analyse de l'espace mémoire inutilisé. - Analyzer memory_analysis = new Analyzer(); + // Analyse de l'espace mémoire inutilisé. + Analyzer memory_analysis = new Analyzer(); long before, after; // Booléen permettant de savoir si une allocation a été effectuée. boolean memory_allocation;