Resizing an Array

Problem

The array filled up, and you got an ArrayIndexOutOfBoundsException .

Solution

Make the array bigger.

Discussion

One approach is to allocate the array at a reasonable size to begin with, but if you find yourself with more data than will fit, reallocate a new, bigger array and copy the elements into it.[22] Here is code that does so:

import java.util.*;
/** Re-allocate an array, bigger... */
public class Array2  {
    public static void main(String argv[]) {
        int nDates = 0;
        final int MAX = 10;
        Calendar dates[] = new Calendar[MAX];
        Calendar c;
        while ((c=getDate(  )) != null) {

            // if (nDates >= dates.length) {
            //     System.err.println("Too Many Dates! Simplify your life!!");
            //     System.exit(1);  // wimp out
            // }

            // better: reallocate, making data structure dynamic
            if (nDates >= dates.length) {
                Calendar tmp[] = new Calendar[dates.length + 10];
                System.arraycopy(dates, 0, tmp, 0, dates.length);
                dates = tmp;    // copies the array reference
                // old array will be garbage collected soon...
            }
            dates[nDates++] = c;
        }
        System.out.println("Array size = " + dates.length);
    }

    static int n;
    /* Dummy method to return a sequence of 21 Calendar references,
     * so the array should be sized >= 21.
     */
    public static Calendar getDate(  ) {
        if (n++ > 21)
            return null;
        return Calendar.getInstance(  );
    }
}

This technique will work reasonably well for simple linear collections of data. For data with a more variable structure, you will probably want to use a more dynamic approach, as in Section 7.4.

[22]

Get Java Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.