next up previous
Next: Dynamic memory management Up: Unit 12 Previous: Limitations of arrays

Dealing with the dimension of an array

Some of the previous limitations can be overcome by suitably manipulating arrays, in such a way that the memory necessary to store the data of the application is allocated and deallocated dynamically during the program execution, depending on the needs.

The following example shows a class for dealing with a list of persons (objects of the class Person) that manages the size of the array dynamically.

public class ListOfPersonsArray {

  private Person[] a;
  private int n;

  public ListOfPersonsArray() {
    a = new Person[10];
    n = 0;
  }

  // Add a person to the List of Persons in the last position
  public void add (Person p) {
    if (n == a.length) {
      // The array is full!!!
      // We have to create a new, bigger array and copy all elements
      Person[] b = new Person[a.length*2];
      for (int i=0; i<a.length; i++)
        b[i] = a[i];
      a = b;
    }
    // Now we are sure that n < a.length
    a[n] = p;
    n++;
  }

  // Remove the person in position k
  public void remove (int k) {
    if ((k >= 0) && (k < n)) {
      // We have to move all elements that follow k
      for (int i = k; i < n; i++)
        a[i] = a[i+1];
      n--;
    }
    // We reduce the dimension of the array if it is sufficiently empty
    if ((a.length > 10) && (n < a.length/4)) {
      Person[] b = new Person[a.length/2];
      for (int i = 0; i < n; i++)
        b[i] = a[i];
      a = b;
    }
  }
}

Note that the dynamic management of the array is not done by dynamically changing its dimension (which is not possible), but by creating a new bigger or smaller array according to the application needs, and copying all values to the new array each time this becomes necessary.

The dimension of a new dynamically created array is doubled when new elements are necessary, and halved when the array is sufficiently empty. The choice of considering the array sufficiently empty when n < a.length/4 allows us to minimize the number of times it is necessary to create a new array, since at most half of the elements of the newly created array are used the moment the array is created.


next up previous
Next: Dynamic memory management Up: Unit 12 Previous: Limitations of arrays