In the previous chapter we introduced arrays of primitive
type values. They generally work in a similar manner as a C programmer
would expect. For example, to create an array of 10 integers we
could use the following :
int
iArray[] = new int[10];
This creates a buffer of ten int
type memory locations with the value of 0 in each.
For arrays of objects, however, the array declaration
only creates the array of references for a particular type. It does
not create objects of that type. That requires an additional step.
For example, lets say we want to create an array of
five String
objects. We first create an array of String
types:
String
[] strArray = new String[5];
When the array is created, each element contains the
special "null"
reference value that points nowhere. So if we followed the
above declaration with an attempt to use a String
method, as in,
int
numChars = strArray[0].length();
an error message will result:
Exception
in thread "main"
java.lang.NullPointerException
at
ArrayTest.main(ArrayTest.java:8)
We need to create an object for each array element
to reference. For example,
strArray[0]
= new String("Alice");
strArray[1] = new String("Bob");
strArray[2] = new String("Cindy");
strArray[3] = new String("Dan");
strArray[4] = new String("Ed");
sets each element to reference a particular string.
Note: For convenience, Java
allows an alternative form of declaration for String
objects :
strArray[0]
= "Alice";
While this is convenient, it only works for string objects
and so we use the general form for creating objects via the new
operator.
Array Copying
A copy of an array can be made with the System
class static method:
arraycopy(Object
src, int src_position,
Object
dst, int dst_position, int length)
where src
is the array to be copied, dst
is the destination array (of same type). The copy begins from src_position
and starts in destination at dst_position
for length
number of elements.
Multi-dimensional Arrays
In Java, multi-dimensional arrays are arrays of arrays.
That is, each element is a reference to an array object. For example,
we could declare a two dimensional array as follows
String [][]
str = new String[3][2];
This is equivalent to
String
[][] str = new String[3][];
str[0] = new String[2];
str[1] = new String[2];
str[2] = new String[2];
However, we don't need to keep the string array lengths
the same. For example, this will also work:
str[0] = new String[2];
str[1] = new String[3];
str[2] = new String[4];
The three 1-D arrays referenced by the three elements
of the str
array can reside in completely different areas in memory.
Elements are referenced by the brackets as usual.
The JVM will check that the indices stay within the limits of each
array.
In this example,
str[0] = new String[]{"alice", "bob"};
str[1] = new String[]{"cathy","don","ed"};
str[2] = new String[]{"fay", "grant", "hedwig",
"ward"};
System.out.println("str[1][2] + str[2][3] = " + str[1][2]
+ str[2][3] );
we use the technique of initializing the values in
the declaration with values between the braces. The print statement
would print out
str[1][2]
+ str[2][3] = edward
More about Arrays as Classes
As we mentioned earlier, arrays in Java are objects. An array inherits
Object and
possesses an accessible property - length
- which provides the number of elements in the array.
For example, if a method uses Object
as an argument, as in
void
aMethod(Object obj)
{ ... }
then an array can be passed in the argument since it is a subclass
of Object:
...
int [] iArray = new int[10];
aMethod(iArray);
...
To make arrays appear in a convenient and familiar form (as in
C, for example), the language designers provided brackets as the
means of accessing the array elements. Without brackets, an array
class would provide an element with a method something like the
following:.
String
str_a = strArray.getElement(1);
instead of
String
str_a = strArray[1];
Arrays are thus somewhat more complicated in Java than in other
languages but the class structure also provides some benefits. For
example, the array checks the element number and if the element
exceeds the declared length of the array, an out of bounds
run-time exception will
be thrown.
So unlike in C or C++, a program cannot go outside the array area
and write to areas of memory where it should not. This avoids a
very common program bug (and hack technique) that can be very difficult
to track down since it may not show up till much later after the
write occurred.
On the other hand, there is some performance penalty in the bounds
checking that can slow down the speed of intensive processing with
arrays.
Modified: May 22, 2008
|