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.